在实际使用中同常会把Eureka Server做多可用性配置,避免由于单节点出现故障而造成整个服务瘫痪,本例继续在上级的基础上做简单的配置修改,以实现高可用性Eureka Server集群的功能。
一、相关说明
1、devTools关闭
为了在idea中启动多个不同配置的应用,修改各module的pom.xm,注释pring-boot-devtools依赖。
<!--<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>-->
2、禁用 Single instance only选项
在idea中选择Edit Configurations选项。
选择其中ProviderApplication、EurekaServerApplication这两个配置,分别把Single instance only前面的勾取消选择。
3、SpringBoot配置文件多环境支持
利用spring.profiles.active 进行配置文件的多环境支持,方便对单一应用的多次不同启动。
- spring.profiles.active:dev 表示的是激活那个环境的配置
- 每个环境配置项是根据 ‘—’ 这个分隔符隔进行隔离
二、Eureka Server改造
1、修改配置文件
- 在其中分别设置两个环境eureka-server1和eureka-server2。
- 注释其中的register-with-eureka和fetch-registry。
- 修改defaultZone属性为两个环境的eureka-server1的地址。
spring:
profiles:
active: eureka-server2
---
spring:
profiles: eureka-server1
application:
name: eureka-server
eureka:
instance:
hostname: eureka-server1 #eureka-sever实例的主机名
client:
#register-with-eureka: false # 不把自己注册到eureka上
#fetch-registry: false #不从eureka上来获取服务的注册信息
service-url:
defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
server:
port: 8761
---
spring:
profiles: eureka-server2
application:
name: eureka-server
eureka:
instance:
hostname: eureka-server2 #eureka-sever实例的主机名
client:
#register-with-eureka: false # 不把自己注册到eureka上
#fetch-registry: false #不从eureka上来获取服务的注册信息
service-url:
defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
server:
port: 8762
2、启动应用
分别把配置文件的spring.profiles.active 设置为,eureka-server1和eureka-server2启动应用。
在浏览器上分别输入http://localhost:8761 和 http://localhost:8762后可以看到两个服务都已经注册成功。
三、生产者改造
1、修改配置文件
- 增加provider1和provider2两个环境的配置。
- 修改defaultZone属性
spring:
profiles:
active: provider1
---
spring:
profiles: provider1
application:
name: provider
server:
port: 8081
eureka:
instance:
prefer-ip-address: true #使用ip地址进行注册
client:
service-url:
defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
---
spring:
profiles: provider2
application:
name: provider
server:
port: 8082
eureka:
instance:
prefer-ip-address: true #使用ip地址进行注册
client:
service-url:
defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
2、修改service
为了方便了解消费者获取到的内容是从哪个端口提供的服务中获取的信息,我们修改下service在返回的字符串中从返回配置的端口号。
package com.roger.provider.service;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Service
public class TicketService {
@Value("${server.port}")
private String serverPort;
public String getTiTicket(){
return "杭州-宁波高铁票,["+serverPort+"] 提供服务!";
}
}
3、启动服务
分别以provider1和provider2配置环境启动生产者,在eureka server控制台中能看到两个provider都已经注册成功。
直接在浏览器中输入地址http://localhost:8081/ticket 和http://localhost:8082/ticket,能看到服务已能正常提供,其中[8081]、[8082]与提供服务的端口号对应。
三、对服务进行消费
本例中的消费者不需要额外的修改,直接启动。在浏览器中输入http://localhost:9001/buyTicket?name=%E6%9D%8E%E4%B8%89%E5%93%81,测试正常,多个生产者采用轮询的方式进行了服务。
配套代码