此文章写的相对比较简便,主要是为了方便新手开发,如果将所有内容一股脑全放出来,反而增加了新手开发的复杂度,个人认为这样通俗易懂,我们都是先将服务搭建起来之后再去了解其中的技术要点
如果需要已经搭建好的项目,去这里下载:https://download.csdn.net/download/qq_27184497/10719245
本文主要围绕搭建一个简单的微服务框架,所以主要项目有三个:
1、eureka注册中心
2、service--服务提供者
3、webapp--服务消费者
好了,废话不多说,直接开始
1、搭建eureka服务注册中心
创建maven项目 :springcloud-1-eureka
pom文件内容如下(因为springcloud是依赖springboot的,所以必须要有springboot的依赖)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.spring.cloud</groupId>
<artifactId>springcloud-1-single-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springcloud-1-single-service</name>
<url>http://maven.apache.org</url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--eureka server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<!-- spring boot test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
添加spring配置文件 application.yml
server:
port: 8888
eureka:
instance:
###注册中心ip
hostname: 127.0.0.1
client:
##是否注册自己。默认true
registerWithEureka: false
##
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
新建注册中心启动类 EurekaApp.java
package com.spring.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* eureka注册中心
*
*/
@SpringBootApplication
//开启eureka服务
@EnableEurekaServer
public class EurekaApp {
/**
*
* @param args
*/
public static void main(String[] args) {
SpringApplication.run(EurekaApp.class, args);
}
}
到这一步,注册中旧搭建好了,现在启动main方法后在浏览器输入 地址 :http://127.0.0.1:8888/ 可以看到如下页面
2、搭建服务提供者service
创建maven项目 springcloud-1-service
pom文件内容
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.spring.cloud</groupId>
<artifactId>springcloud-1-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springcloud-1-service</name>
<url>http://maven.apache.org</url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
spring配置文件 application.yml
eureka:
client:
serviceUrl:
##注册中心服务器地址
defaultZone: http://localhost:8888/eureka/
server:
##当前服务ip
port: 8763
spring:
application:
##当前服务的别名
name: service-member
服务启动类 ServiceApp.java
package com.spring.cloud.service;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* service服务--服务提供者
*
*/
@SpringBootApplication
// 使eureka客户端生效
@EnableEurekaClient
public class ServiceApp {
public static void main(String[] args) {
SpringApplication.run(ServiceApp.class, args);
}
}
服务接口类 ServiceController.java--(我称呼为controller层)
package com.spring.cloud.service.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ServiceController {
//读取yml配置文件中的端口号属性
@Value("${server.port}")
private String port ;
/**
*
* @return
*/
@RequestMapping(value = "/getService")
public String getService() {
return "this is service,port is " + port;
}
}
到这一步,服务提供者也已经搭建好了启动main方法在浏览器输入: http://127.0.0.1:8763/getService 可以看到如下页面
并且注册中心也注册了这个服务
3、搭建服务消费者 webapp
创建maven项目 springcloud-1-webapp
pom文件内容
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.spring.cloud-webapp</groupId>
<artifactId>springcloud-1-webapp</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>springcloud-1-webapp Maven Webapp</name>
<url>http://maven.apache.org</url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
spring配置文件 application.yml
eureka:
client:
serviceUrl:
##注册中心服务器地址
defaultZone: http://localhost:8888/eureka/
server:
##当前服务ip
port: 8080
spring:
application:
##当前服务的别名
name: webapp
启动类 WebApp.java
package com.springcloud.webapp;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
// 使eureka客户端生效
@EnableEurekaClient
public class WebApp {
public static void main(String[] args) {
SpringApplication.run(WebApp.class, args);
}
//生成实例,在其他地方就可以直接使用@Autowire注解自动注入
@Bean
//开启负载均衡功能--如果需要使用rest方式调用必须加上这个注解,@LoadBalanced是ribbon的功能
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
controller控制层 WebController.java
package com.springcloud.webapp.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class WebController {
@Autowired
private RestTemplate restTemplate;
/**
*
* @return
*/
@RequestMapping(value = "/getWebapp")
public String getString () {
//使用http链接方式调用
// String url = "http://service-member/getService";
//使用rest方式调用必须在restTemplate注入前加上@LoadBalanced注解,目的是开启的负载均衡的功能。其中service-member是服务的别名
String url = "http://service-member/getService";
return restTemplate.getForObject(url, String.class);
}
}
到这一步,所有的项目和服务都已经搭好了
启动webapp的main方法,在浏览器输入:http://127.0.0.1:8080/getWebapp 就可以获取到服务中的内容
4、负载均衡的实现
到此为止,这还只是单个服务的调用,如何实现多服务负载均衡呢?
其实也很简答,只需要将服务提供者 springcloud-1-service 换个ip地址在启动一次就可以了,
将 springcloud-1-service 的 application.yml 的端口换成8762
s
因为8763刚才已经启动过一次了,所以在这里改了端口号之后再将springcloud-1-service的 main方法启动一次即可
启动后,我们可以在注册中心看到,服务提供者service有2个服务在运行,这2个服务的端口分别是8762 和8763
然后我们在浏览器输入服务消费者 webapp的链接地址:http://127.0.0.1:8080/getWebapp
第一次访问的是8762的端口
然后刷新一下就变成了8763
好啦,到这里,负载均衡的功能就完成了,
最后给我的私人网站打个广告