1.添加本地域名映射
打开host文件,路径如下:
添加以下配置,然后保存
#eureka ip
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
2.新建第二个eureka服务模块,并修改两个eureka服务的yml配置文件
导入的依赖跟第一个eureka服务模块的相同,修改两个模块的yml配置文件,让他们的服务地址互相改为对方的地址,形成互相注册,互相守望的效果,并且修改hostname为刚才设置的本地域名。
7001端口的服务yml配置如下:
server:
port: 7001
eureka:
#eureka服务的实例名称
instance:
hostname: eureka7001.com
client:
#不将自己注册进eureka
register-with-eureka: false
#指示此客户端是否应从eureka服务器获取eureka注册表信息,自己就是注册中心所以关闭
fetch-registry: false
service-url:
#设置与eureka服务交互的查询和注册服务的地址
defaultZone: http://eureka7002.com:7002/eureka/
7002端口的服务yml配置如下:
server:
port: 7002
eureka:
#eureka服务的实例名称
instance:
hostname: eureka7002.com
client:
#不将自己注册进eureka
register-with-eureka: false
#指示此客户端是否应从eureka服务器获取eureka注册表信息,自己就是注册中心所以关闭
fetch-registry: false
service-url:
#设置与eureka服务交互的查询和注册服务的地址
defaultZone: http://eureka7001.com:7001/eureka/
3.打开两个eureka监控页面查看
7001端口的:
7002端口的:
每个服务出现另一个服务的域名,则代表集群搭建成功
4.配置提供者集群
复制一份provider模块,把端口设置为8012,如下图所示:
修改两个提供者项目的控制器,使其显示端口,便于分辨调用的哪一个提供者的服务:
5.添加提供者和消费者客户端到集群
修改payment提供者服务和order消费者服务的yml配置,将eureka服务地址改为两个server的地址。
两个都改为:
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka
然后要先开启eureka服务集群,注册中心如下所示:
6.使用消费者进行测试
首先需要注意,目前配置了提供者集群,所以需要开启restTemplate的负载均衡功能,才能自动选择一个提供者服务进行调用,开启负载均衡,需要使用@loadBalanced
注解
@Configuration
public class ApplicationContextConfig {
//注册restTemplate进容器
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
将restTemplate的请求地址改为注册中心中的提供者服务的名称CLOUD-PAYMENT-SERVICE
然后启动消费者模块,进行测试,第一次访问是8011端口的
第二次访问是8012端口的
7.修改提供者客户端实例名称和显示其ip地址
在两个提供者模块下的yml配置文件中,加入以下配置,另一个实例id为payment8012
eureka:
instance:
instance-id: payment8011
#访问路径显示ip
prefer-ip-address: true
配置完成后,重新启动项目,打开eureka服务中心,可以看到已经显示的是设置的实例id,同时出现了ip地址。
8.使用服务发现
首先需要在主启动类上加入@EnableDiscoveryClient
注解
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class CloudProviderPayment8011Application {
public static void main(String[] args) {
SpringApplication.run(CloudProviderPayment8011Application.class, args);
}
}
然后写一个控制器方法进行测试,使用discoveryClient进行操作。
@Autowired
DiscoveryClient discoveryClient;
@GetMapping("/discovery")
public Object discovery(){
//显示所有服务
List<String> services = discoveryClient.getServices();
for (String service : services) {
log.info(service);
}
//通过服务id发现服务
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
for (ServiceInstance instance : instances) {
log.info("host:{},port:{},uri:{}",instance.getHost(),instance.getPort(),instance.getUri());
}
return this.discoveryClient;
}
访问对应路径后,控制台输出: