为什么需要搭建集群?
注册中心作为微服务架构中的核心功能,其重要性不言而喻。在实际生产中,都会去搭建应用的集群来保证服务高可用。Eureka Server注册中心集群中每个节点都是平等的,集群中的所有节点同时对外提供服务的发现和注册等功能。同时集群中每个Eureka Server节点又是一个微服务,也就是说,每个节点都可以在集群中的其他节点上注册当前服务。又因为每个节点都是注册中心,所以节点之间可以相互注册当前节点中已注册的服务,并发现其他节点中已注册的服务。
Eureka集群环境搭建
1、修改本地localhost映射
修改 C:\Windows\System32\drivers\etc 底下的 host文件
添加
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
如果电脑内存够用的话,也可以添加多个。电脑内存有限这里就先配置两个。
2、新建module – cloud-eureka-server7002
配置方面与之前的EurekaServer7001 如出一辙,copy就完事了
复制EurekaServer7001
复制pom、Main启动程序、WebSecurityConfig
application.yml
yml文件我们需要做一些改动,包括我们之前的Eureka7001项目
Eureka7001 的 application.yml
server:
port: 7001
spring:
security:
user:
name: admin # 用户名
password: 123456 # 用户密码
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名称
client:
#false表示不向注册中心注册自己
register-with-eureka: false
#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: false
service-url:
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@eureka7002.com:7002/eureka/
Eureka7002 的 application.yml
server:
port: 7002
spring:
security:
user:
name: admin # 用户名
password: 123456 # 用户密码
eureka:
instance:
hostname: eureka7002.com #eureka服务端的实例名称
client:
#false表示不向注册中心注册自己
register-with-eureka: false
#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: false
service-url:
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ 单机版
defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@eureka7001.com:7001/eureka/ #集群版,如果集群数有多个可以后面继续添加,‘,’号分隔
改动说明:
hostname 改成了 我们本地映射的两个地址
defaultZone 改成非本身的EurekaServer 注册地址
互相注册,相互守望
3、启动程序测试
可以看到我们访问的EurekaServer已经互相注册成功,并且之前的订单服务以及支付服务也都注册正常。
服务提供者集群搭建
1、新建module – 服务提供者
cloud-provider-payment8002
相关代码从cloud-provider-payment8001进行copy就可以
留意一下yml文件的端口号改为8002
2、修改服务调用
创建完成后,我们启动项目,查看EurekaServer,可以看到两个支付服务已经全部完成创建了
回顾订单服务80的调用,当时是写死的调用地址,现在我们改为调用微服务名
下图中PAYMENT-PROVIDER-SERVICE就是我们服务提供者的微服务注册码
接下来我们进行调用服务,会发现报错了
这是正常现象,因为我们漏了一步。
消费者要想能够正常通过restTemplate调用提供者,需要加上一个注解
需要加上@LoadBalanced注解
//RestTemplate并且开启了客户端负载均衡功能
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
加上之后,就可以正常通过微服务名去调用我们的服务了
服务调用成功,但是支付服务PaymentService已经部署了集群,我们可以修改Controller使返回值加上端口号,看看是哪个端口为我们提供了服务
@Value("${server.port}")
private String port;
返回值中加上port就可以了
3、测试
功能测试完毕,可以发现负载均衡也已经实现,默认为轮询策略