使用 Spring Cloud 实现微服务系统
准备工作:
为了方便创建项目,以及各版本以来关系,此次创建项目使用 Spring Assistant
插件。
创建单体服务中心项目
启用服务端的服务注册,发现功能
@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/
打包和部署
打包
部署 服务中心 集群
在 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
gitee:https://gitee.com/Jacob-gitee/eureka/tree/master/eureka
实现单体"服务提供者"客户端
使用插件创建 客户端,最后使用选择 Eureka Discovery Client
:
添加依赖
<!-- 不加此依赖会: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
用 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();}}