Eruake集群搭建(实现代码)
搭建注册中心集群 以防出现单点故障 也就是唯一那个注册中心出现故障 导致整个架构故障
此次实现时伪集群,单台计算机搭建,所以需要修改host文件进行模拟
C:\Windows\System32\drivers\etc\hosts 修改映射文件
127.0.0.1 eureka1 127.0.0.1 eureka2
eureka1配置 (这里使用一个项目搭建,使用idea复制启动类,读取不同的配置文件即可)
application-server1.yml
spring: application: name: eureka server: port: 8761 eureka: client: service-url: #注册中心地址 defaultZone: http://eureka2:8762/eureka instance: hostname: eureka1
eureka2配置
application-server2.yml
spring: application: name: eureka server: port: 8762 eureka: client: service-url: #注册中心地址 互相注册,将1注册到2,2注册到1 defaultZone: http://eureka1:8761/eureka instance: hostname: eureka2
注意:
1.配置文件中的 hostname 属性与注册的主机地址相同。
2.集群中不能有以下配置,否则集群中的eruake服务无法互相发现,互相拉去服务,也无法监听到,并且提示无法使用,但是这种情况下服务还能够正常运行,所以很多人忽略此问题。
#false表示不向服务器注册自己 register-with-eureka: false #false表示自己就是注册中心 去维护服务实例 不需要去检索服务 fetch-register: false
此时我们分配启动查看。
我们发现集群中的服务已经互相注册,然后我们查看这里
unavailable代表不能使用的,available代表正常的。如果配置了不拉去不发现自身服务则会出现问题。
此时简单的集群搭建完成,下面我们来注册两个服务提供和一个调用调用。
用户服务
8001端口用户服务(为了隐藏数据库连接使用了config配置中心配置到git中,重点是eruake配置)
spring: application: name: user-server #被提取到gitee中了 cloud: config: discovery: #开启使用config配置中心 enabled: true #配置中心服务应用名称 service-id: config-server #git分支名称 label: master #git文件名称 name: user #git文件环境 profile: test #mybatis别名 #被提取到gitee中了 #配置eureka客户端 eureka: client: service-url: defaultZone: http://eureka1:8761/eureka,http://eureka2:8762/eureka instance: prefer-ip-address: true server: port: 8001 management: endpoints: web: exposure: #此处刷新地址必须叫refresh include: refresh
8002端口用户服务
使用idea的功能复制一个相同的启动类然后指定端口即可,模仿创建了集群。
重要的是 defaultZone 属性 需要同时向两个服务中注册。或者向其中一个服务中注册 ,因为eruake是相互监听拉取的。
现在启动两个服务提供者查看
服务成功注册到eruake中。
下面注入一个调用者
调用者/消费者
server:
port: 8081
spring:
application:
name: consumer-service
#配置eureka客户端
eureka:
client:
service-url:
defaultZone: http://eureka1:8761/eureka,http://eureka2:8762/eureka
instance:
prefer-ip-address: true
启动
注册成功,这里我们为了演示方便不使用Fegin负载均衡调用消费者,直接使用 RestTemplate 搭配 ribbon
@Bean @LoadBalanced //使用ribbon public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); return restTemplate; }
@RestController public class UserController { @Autowired RestTemplate restTemplate; @Autowired private DiscoveryClient discoveryClient; @RequestMapping("users/{id}") public R users(@PathVariable Integer id) { //根据服务应用名称从注册列表获取服务实例 String strUrl = "http://user-server/users/" + id; R forObject = restTemplate.getForObject(strUrl, R.class); return forObject; }
}
直接访问8081消费者接口
我们发现其中的port字段会随之变化,者是ribbon按照一定的策略进行了负载均衡