使用 Spring Cloud 实现微服务系统

准备工作:
为了方便创建项目,以及各版本以来关系,此次创建项目使用 Spring Assistant插件。

image-20200814150423923

创建单体服务中心项目

image-20200814150510729

image-20200814150554938

image-20200814150642472

启用服务端的服务注册,发现功能

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerDemoApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerDemoApplication.class, args);}}

配置“服务中心”地址,端口号,应用名称

# 端口
server.port=8080
# 服务名
spring.application.name=Eureka Server Demo
# 是否注册到 Eureka Server,默认为true
eureka.client.register-with-eureka=true
# 是否从 Eureka Server 获取注册信息,默认为true
eureka.client.fetch-registry=true
# 设置与 Eureka Server 进行交互的地址,查询服务和注册服务都需要使用他。多个地址使用 "," 分割。
eureka.client.service-url.default-zone=http://localhost:8080/eureka/

gitee:https://gitee.com/Jacob-gitee/eureka/tree/master/eureka1/

实现服务集群

配置虚拟地址

# 节点1
127.0.0.1       node1
# 节点2
127.0.0.1       node2
# 节点3
127.0.0.1       node3

多环境配置

创建节点 node1 配置文件 application-node1.pproperties,并指向 node2 和 node3。

# 端口
server.port=8081
# 服务名
spring.application.name=Eureka Server Demo
# 节点名
eureka.instance.hostname=node1
# 是否注册到 Eureka Server,默认为true
eureka.client.register-with-eureka=true
# 是否从 Eureka Server 获取注册信息,默认为true
eureka.client.fetch-registry=true
# 设置与 Eureka Server 进行交互的地址,查询服务和注册服务都需要使用他。多个地址使用 "," 分割。
eureka.client.service-url.defaultZone=http://node2:8082/eureka/,http://node3:8083/eureka/

创建节点 node2 配置文件 application-node2.pproperties,并指向 node1 和 node3。

# 端口
server.port=8082
# 服务名
spring.application.name=Eureka Server Demo
# 节点名
eureka.instance.hostname=node2
# 是否注册到 Eureka Server,默认为true
eureka.client.register-with-eureka=true
# 是否从 Eureka Server 获取注册信息,默认为true
eureka.client.fetch-registry=true
# 设置与 Eureka Server 进行交互的地址,查询服务和注册服务都需要使用他。多个地址使用 "," 分割。
eureka.client.service-url.defaultZone=http://node1:8081/eureka/,http://node3:8083/eureka/

创建节点 node3 配置文件 application-node3.pproperties,并指向 node1 和 node2。

# 端口
server.port=8083
# 服务名
spring.application.name=Eureka Server Demo
# 节点名
eureka.instance.hostname=node3
# 是否注册到 Eureka Server,默认为true
eureka.client.register-with-eureka=true
# 是否从 Eureka Server 获取注册信息,默认为true
eureka.client.fetch-registry=true
# 设置与 Eureka Server 进行交互的地址,查询服务和注册服务都需要使用他。多个地址使用 "," 分割。
eureka.client.service-url.defaultZone=http://node1:8081/eureka/,http://node2:8082/eureka/

打包和部署

打包

使用 Maven 命令 进行打包

部署 服务中心 集群

在 3个DOS命令窗口分别暑促一下命令启动服务中心:

# node1
java -jar eureka-0.0.1.jar --spring.profiles.active=node1
# node2
java -jar eureka-0.0.1.jar --spring.profiles.active=node2
# node3
java -jar eureka-0.0.1.jar --spring.profiles.active=node3

image-20200814150905920

image-20200814150938328

image-20200814151018593

gitee:https://gitee.com/Jacob-gitee/eureka/tree/master/eureka

实现单体"服务提供者"客户端

使用插件创建 客户端,最后使用选择 Eureka Discovery Client

image-20200814151234217

添加依赖

<!-- 不加此依赖会:registration status: 204 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

添加配置

# 服务名
spring.application.name=provider
# 应用的端口号
server.port=8000
provider.name=provider0
# "服务中心" 地址
eureka.client.service-url.defaultZone=http://node1:8081/eureka/

启用客户端的服务注册,发现功能:

@EnableDiscoveryClient
@SpringBootApplication
public class EurekaServerClientApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerClientApplication.class, args);}}

使用 Eureka 启用客户端服务的注册和发现功能,可以使用注解 @EnableEurekaClient 和 @EnableDiscoveryClient 来实现。如果使用其他"服务中心"(zookeeper,Consul),则使用 @EnableDiscoveryClient 来实现。@EnableEurekaClient 是 Eureka 的专用注解。

实现"服务提供者"接口

@RestController
public class HellController {@Value("${server.port}")private String port;@Value("${provider.name}")private String name;@GetMapping("hello")public String hello(){return "provider:"+ name+" port:"+port;}
}

实现"服务提供者"集群

多环境配置

创建配置文件 application-provider1.properties,并做如下配置:

# 服务名
spring.application.name=provider
# 应用的端口号
server.port=8001
# 自定义配置项
provider.name=provider1
# "服务中心" 地址
eureka.client.service-url.defaultZone=http://node1:8081/eureka/,http://node2:8082/eureka/,http://node3:8083/eureka/

创建配置文件 application-provider2.properties,并做如下配置:

# 服务名
spring.application.name=provider
# 应用的端口号
server.port=8002
# 自定义配置项
provider.name=provider2
# "服务中心" 地址
eureka.client.service-url.defaultZone=http://node1:8081/eureka/,http://node2:8082/eureka/,http://node3:8083/eureka/

打包启动

# 打包
mvn clean package
# 启动
java -jar eureka-clien.0.0.1.jar --spring.profiles.active=provider1
java -jar eureka-clien.0.0.1.jar --spring.profiles.active=provider2

image-20200814151321719

image-20200814153202005

image-20200814153800268

用 Feign 实现"服务消费者"

创建 Eureka 的客户端

创建过程 参照:实现单体"服务提供者"客户端

添加依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>

添加配置

# 服务名
spring.application.name=consumer
# 应用的端口号
server.port=9000
# 不注册到"服务中心"
eureka.client.register-with-eureka=false
# "服务中心" 地址
eureka.client.service-url.defaultZone=http://node1:8081/eureka/,http://node2:8082/eureka/,http://node3:8083/eureka/

启用客户端的发现和远程调用

// 启动 feign 远程调用服务
@EnableFeignClients
// 启用客户端的服务注册,发现功能
@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}}

调用"服务提供者"接口

// 远程服务名
@FeignClient(name = "provider")
public interface MyFeignClient {// 此接口需要和远程调用接口方法名,参数保持一致@GetMapping("/hello")public String hello();}

实现"客户端"接口

@RestController
public class FeignController {@Autowiredprivate MyFeignClient myFeignClient;@GetMapping("hello")public String hello(){return myFeignClient.hello();}}

测试微服务系统

image-20200814155041589

image-20200814154944439