Eureka 服务端集群
服务集群部署可以在 Eureka项目构筑基础上调整得到。
Eureka服务之间彼此互相注册
配置文件如:
端口7001 Eureka服务yml配置。service-url 指向了端口7002的Eureka . 其服务器的别名从原先的单体localhost 变成了 eurekaXXX.com 形式的域名方式
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com
client:
#不向注册中心注册自己
register-with-eureka: false
#自己已经是注册中心,不需要去检索服务
fetch-registry: false
service-url:
defaultZone: http://eureka7002.com:7002/eureka/
端口7002 Eureka服务yml配置 与7001类似,唯一不同的是指向的 service-url 地址变成了7001 端口所在的服务器。
如果要部署2台以上的Eureka服务,可以在defaultZone 往后继续填写,Eureka服务URL ,service-url值是一个Map,可以传入多个值。
完成上述步骤之后打开 链接 http://eureka7001.com:7001 或 http://eureka7002.com:7002
可以看到如下效果
发现两个Eureka服务互相指向对方
Eureka 客户端集群
单体项目中此前采用写死的代码让 cloud-order-service 调用 cloud-payment-service
public static final String PAYMENT_URL="http://localhost:8001";
@Autowired
private RestTemplate restTemplate;
@GetMapping("/consumer/payment/get/{id}")
public CommonResult<Payment> getPayment(@PathVariable("id")Long id){
return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
}
这种方式存在不小的问题,服务8001一旦挂掉整个cloud-order-service的服务功能也会跟着无法使用,在集成了Eureka后,可以使用域名对cloud-payment-service 进行调用。代码上的调整也简单。
首先需要对服务cloud-payment-service 部署到Eureka上。
配置修改(以8001为例。8002服务类似)
server:
port: 8001
spring:
application:
name: cloud-payment-service
...常规的配置
eureka:
client:
#是否把自己注册进EurekaServer 默认为true
register-with-eureka: true
#是否从Eureka抓取已有的注册信息,默认true 单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetch-registry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
8001与8002服务使用的spring.application.name均为 cloud-payment-service,这与Eureka服务器不一样,Eureka服务器这需要其eureka.instance.hostname 命名有一定的区分,作为客户端,它需要把全部的Eureka服务器端的url注册到自己的配置文件中。
对代码方面的调整:
控制器层面使用服务名访问服务:
public static final String PAYMENT_URL="http://CLOUD-PAYMENT-SERVICE";
@Autowired
private RestTemplate restTemplate;
@GetMapping("/consumer/payment/get/{id}")
public CommonResult<Payment> getPayment(@PathVariable("id")Long id){
return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
}
在部署了集群的服务上,需要对RestTemplate 的调用指定一下访问策略。需要在配置文件进行调整:
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
在未指定的情况下,会出现异常报错:
java.net.UnknownHostException: CLOUD-PAYMENT-SERVICE
at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:220) ~[na:na]
at java.base/java.net.Socket.connect(Socket.java:609) ~[na:na]
...其后省略