我们知道在微服务的架构中,通常会根据系统的特性、特点将系统成分成多个模块(服务),用于应对高并发,大量数据的对外服务。
这时,拆分系统后,比如将拆分成了 订单服务,商品服务,用户服务,库存服务,积分服务,积分服务等,拆开后就代表可以独自发布。
这样就导致了 各个服务之间 不能互相通信了,比如 下单时,需要减库存(库存服务),需要给下单人 加积分(积分服务)等。
所以为了 能够让对应的模块 获取其他的模块信息,首先要解决的问题就是要知道,我需要的服务在哪里?
这样就出现了一种解决方案,那就是用个第三方来存储 所有的服务的元信息(可以简单理解为ip:port),这个第三方就称为 服务注册中心
微服务架构中 常用的注册中心有 eureka,zookeeper,nacos等。
我这看下eureka的简单使用
我这里采用的是当前最新版本
SpringBoot版本为: 2.1.8.RELEASE
SpringCloud版本为: Greenwich.SR2
# 端口号 server: port: 7000 spring: application: name: eureka-server eureka: instance: hostname: server client: # 是否拉取 注册的服务信息, 默认false;因为这是一个单点的EurekaServer,不需要同步其它EurekaServer节点的数据 fetch-registry: false # 是否注册自身到eureka服务,默认false register-with-eureka: false 复制代码
注意:6000这个端口不要用,一个坑,好像chrome.edge把这个端口禁用了,有的浏览器能用。
// 添加 @EnableEurekaServer @EnableEurekaServer @SpringBootApplication public class LinnEurekaApplication { public static void main(String[] args) { SpringApplication.run(LinnEurekaApplication.class, args); } } 复制代码
windows 系统在 C:/Windows/System32/drivers/etc/hosts 打开后添加
eureka支持配置集群,即每一台 Eureka 都在配置中指定另一个 Eureka 或多个 地址作为伙伴,它在启动时会向伙伴节点获取注册列表
配置如下:
① application-server1.yml文件
# 端口号 server: port: 7001 eureka: instance: hostname: server1 client: # 是否拉取 注册的服务信息, 默认true fetch-registry: false # 是否注册自身到eureka服务,默认true register-with-eureka: false # 如果是单节点eureka-server, 这里可以不用写 ;如果写了 表示 配置成 高可用集群,用逗号分割 其他server地址 serviceUrl: defaultZone: http://server2:7002/eureka/,http://server3:7003/eureka/ 复制代码
② application-server2.yml文件
# 端口号 server: port: 7002 eureka: instance: hostname: server2 client: # 是否拉取 注册的服务信息, 默认true fetch-registry: false # 是否注册自身到eureka服务,默认true register-with-eureka: false # 如果是单节点eureka-server, 这里可以不用写 ;如果写了 表示 配置成 高可用集群,用逗号分割 其他server地址 serviceUrl: defaultZone: http://server1:7001/eureka/,http://server3:7003/eureka/ 复制代码
③ application-server3.yml文件
# 端口号 server: port: 7003 eureka: instance: hostname: server3 client: # 是否拉取 注册的服务信息, 默认true fetch-registry: false # 是否注册自身到eureka服务,默认true register-with-eureka: false # 如果是单节点eureka-server, 这里可以不用写 ;如果写了 表示 配置成 高可用集群,用逗号分割 其他server地址 serviceUrl: defaultZone: http://server1:7001/eureka/,http://server2:7002/eureka/ 复制代码
java -jar xxx.jar --spring.profiles.active=server1
java -jar xxx.jar --spring.profiles.active=server2
java -jar xxx.jar --spring.profiles.active=server3
如果在 idea中可以直接配置指定:
看到有另外的两个副本 表示 配置成功
spring: application: name: eureka-server eureka: client: # 是否拉取 注册的服务信息, 默认true fetch-registry: false # 是否注册自身到eureka服务,默认true register-with-eureka: false serviceUrl: defaultZone: http://server6:7006/eureka/,http://server7:7007/eureka/,http://server8:7008/eureka/ --- spring: profiles: es1 server: port: 7006 eureka: instance: hostname: server6 --- spring: profiles: es2 # 端口号 server: port: 7007 eureka: instance: hostname: server7 --- spring: profiles: es3 # 端口号 server: port: 7008 eureka: instance: hostname: server8 复制代码
客户端就是所有的服务提供方,比如用户服务,订单服务,库存服务,都需要注册到 eureka。
注册到 eureka非常简单,我创建了一个order-service工程,模拟订单服务,分三步走:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> 复制代码
// 添加 @EnableEurekaClient 注解 // 后来看官网说是 可以不用加 @EnableEurekaClient 注解(只需要添加上面的依赖就可以了),我没有加也是可以注册上去的 //@EnableEurekaClient @SpringBootApplication public class LinnOrderApplication { public static void main(String[] args) { SpringApplication.run(LinnOrderApplication.class, args); } } 复制代码
# 应用名称 spring: application: name: order-service server: port: 9000 eureka: client: serviceUrl: # 注册中心地址,写一个即可,其他会同步过去 #defaultZone: http://server1:7001/eureka,http://server2:7002/eureka,http://server3:7003/eureka, defaultZone: http://server1:7001/eureka 复制代码
访问之前注册中心地址 server1:7001
看到 有order-service注册上去了
这里集群就是 每个被拆分的服务 分多分部署,比如还是以订单为例
①application-order1.yml 文件
server: port: 9001 eureka: client: serviceUrl: defaultZone: http://server1:7001/eureka 复制代码
②application-order2.yml 文件
server: port: 9002 eureka: client: serviceUrl: defaultZone: http://server1:7001/eureka 复制代码
java -jar xxx.jar --spring.profiles.active=order1 java -jar xxx.jar --spring.profiles.active=order2
或者在idea中配置
可以看到 order-service 有两个服务提供 分别在 9001 和9002 端口,这就表示 客户端集群成功了