避免一台Server挂掉,影响整个服务,搭建server集群
同9001
9002的yml
server:
# 修改端口号
port: 9002
eureka:
instance:
# 创建主机域名(别名)
hostname: eureka9002.com
client:
#不向注册中心注册自己
register-with-eureka: false
#表示自己就是注册中心,作用就是维护注册服务实例,不需要去检索服务
fetch-registry: false
service-url:
#设置与eureka-server9001交互的模块
defaultZone: http://eureka9001.com:9001/eureka/
类似9001
修改9001的yml。只保留了修改部分
# 修改成域名的形式,需要host文件的映射支持
hostname: eureka9001.com:9001
service-url:
#设置与eureka-server9002交互的模块,
defaultZone: http://eureka9002.com:9002/eureka/
1.文件:C:\Windows\System32\drivers\etc\host
2.文件可以先拷贝到桌面,修改后,再拷贝回去
3.加入内容:
#eureka主机名和ip映射
127.0.0.1 eureka9001.com
127.0.0.1 eureka9002.com
启动9001和9002
打开浏览器,分别输入eureka9001.com和eureka9002.com,查看服务列表里面是否有对方服务
9001的域名改了,重新配置
新增了9002的服务群,用逗号“,”分隔后添加
eureka:
client:
service-url:
#表示将自己注册到哪个eureka-server
defaultZone: http://eureka9001.com:9001/eureka,http://eureka9002.com:9002/eureka
同上
1.参考member-service-provider-l0000来创建member-service-provider-10002即可
2.创建好后,使用nember-service-provider-10000的源码和配置替换member-service-provider-10002生成的代码(不要到磁盘整体拷贝,会出现关联到member-service-provider-10000的问题,很麻烦,可以创建好新项目的包,然后再拷贝对应包下的文件,就不会出问题)
3.提醒,拷贝时不要忘记拷贝resources/mapper/MemberMapper.xml这些Xxx.xml文件
修改端口为:10002,name: member-service-provider-10002
改为带有10000和10002的类名,便于区分
启动eureka server集群(目前2台)
启动member-service-provider--10000
启动member-service-provider-10002
测试页面
因为member.-service-provider-10000和member-service-provider-10002作为一个集群提供服务,因此需要将spring.application.name进行统一,都改为:
name: member-service-provider
这样消费方通过统一的别名进行负载均衡调用
说明:
1.MEMBER-SERVICE-PROVIDER就是服务提供方【集群】,注册到Eureka Server的名称
2.也就是服务提供方provider【集群】对外暴露的名称为MEMBER-SERVICE-PROVIDER
3.MEMBER-SERVICE-PROVIDER目前有两个Availability Zones member-service-provider:10000
还有一个member-service-provider:10002
需要增加一个注@LoadBalanced赋予RestTemplate负载均衡的能力,也就是会根据你的负载均衡
来选择某个服务去访问,默认是轮询算法,当然我们也可以自己配置负载均衡算法
//private static final String MEMBER_SERVICE_PROVIDER_URL="http://localhost:10000";
private static final String MEMBER_SERVICE_PROVIDER_URL="http://MEMBER-SERVICE-PROVIDER";
说明:配置注入RestTemplate bean/对象
这里的@LoadBalanced就是赋予RestTemplate负载均衡的能力
默认是使用轮询算法来访问远程调用接口/地址
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
启动eureka server集群(目前2台)
启动member-service-provider-10000
启动member-service-provider-10002
不急,先测试:
http://localhost:10000/member/query/1
http://localhost:10002/member/query/1
启动member-service-consumer-80
浏览器访问:http://localhost/member/consumer/query/1
这儿没有端口号是因为,localhost的缺省端口就是80
交替访问member服务说明:
1.注解@LoadBalanced底层是Ribbon支持算法
2.Ribbon和Eureka整合后consumeri直接调用服务而不用再关心地址和端口号,且该服务还有负载功能
这里我们以服务消费方,去获取Eureka Server的服务注册信息为例
当然也可以在服务提供方获取Eureka Server的服务注册信息
member-service-consumer-80/MemberConsumerController.java
调用getServices()获取服务列表,返回discoveryClient即可在网页显示。其余都是日志显示,用处不大。
@Resource
private DiscoveryClient discoveryClient;
@GetMapping("/member/discovery")
public Object discovery(){
List services = discoveryClient.getServices();
for (String service : services) {
log.info("服务={}",service);
List instances = discoveryClient.getInstances(service);
for (ServiceInstance instance : instances) {
log.info("服务号={},主机号={},端口号={},uri={}",instance.getInstanceId(),
instance.getHost(),instance.getPort(),instance.getUri());
}
}
return discoveryClient;
}
浏览器地址栏输入:http://localhost/member/discovery
1.在引入DiscoveryClientl时,不要引入错误的包
正确的包,是一个接口:import org.springframework.cloud.client.discovery.DiscoveryClient;
错误的包,是一个类:import com.netflix.discovery.DiscoveryClient;
2.演示的是在服务消费方使用DiscoveryClient来完成服务发现,同样,在服务提供方模块也OK
至此,服务与发现已经完成。接下来是Ribbon负载均衡