我们知道在微服务的架构中,通常会根据系统的特性、特点将系统成分成多个模块(服务),用于应对高并发,大量数据的对外服务。
这时,拆分系统后,比如将拆分成了 订单服务,商品服务,用户服务,库存服务,积分服务,积分服务等,拆开后就代表可以独自发布。
这样就导致了 各个服务之间 不能互相通信了,比如 下单时,需要减库存(库存服务),需要给下单人 加积分(积分服务)等。
所以为了 能够让对应的模块 获取其他的模块信息,首先要解决的问题就是要知道,我需要的服务在哪里?
这样就出现了一种解决方案,那就是用个第三方来存储 所有的服务的元信息(可以简单理解为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 端口,这就表示 客户端集群成功了