SpringCloud详解 第一章 服务治理Eureka (一)
一、概述
Eureka中的三大角色
- Eureka Server:服务的注册与发现
- Service provider 服务的提供者,将服务注册到Eureka,当中
- Servce consumer 服务发消费者 ,从Eureka服务列表中获得服务,然后进行消费
二、Eureka管理者,就是zookeeper
- 其实就是这个maven
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
###服务端口号 server: port: 7001 eureka: instance: hostname: eureka7001 client: fetch-registry: false # 不用检索服务 自己是注册中心 register-with-eureka: false #不向注册中心注册自己 // 服务端集群配置 service-url: defaultZone: http://eureka7001:7001/eureka
@EnableEurekaServer @SpringBootApplication public class Eureka7001Application { public static void main(String[] args) { SpringApplication.run(Eureka7001Application.class,args); } }
- 启动后访问
http://localhost:7001
看到一个网站
三、Eureka功能提供者
- 其实就是这个maven
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
# 服务提供者yml配置 server: port: 8001 spring: application: name: provider eureka: #设置eureka注册服务的地址 client: service-url: defaultZone: http://eureka7001:7001/eureka/ instance: instance-id: microservice-provider-dept-8001 #配置服务的别名 prefer-ip-address: true # 注册的时候使用ip注册
@SpringBootApplication @EnableEurekaClient public class provider{ public static void main(String[] args) { SpringApplication.run(provider.class, args); } }
- 暴露服务,就是正常的一个MVC接口就行
- 把上面的功能模块启动后,就能在服务管理者刚才的网站上看到一个provider服务
四、Eureka消费者
- 跟功能提供者一样的新建思路,maven依赖也一样
- 添加ribbon的maven依赖,ribbon往下看,这里直接用
- 功能提供者也能是消费者,相互调用
- 这是是表示入口消费者,也就是自定义网关,需要有一个入口把所有的服务都总结起来,所有人都访问这个入口就行,如果有多个一样的入口,就需要用nginx轮询代理
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>
- yml配置
server: port: 80 eureka: client: service-url: #eureka发现服务的列表 defaultZone: http://eureka7001:7001/eureka #自己不能注册 自己只需要通过eureka发现服务 register-with-eureka: false
- 修改入口文件,添加注解
@SpringBootApplication @EnableDiscoveryClient public class consumer{ public static void main(String[] args) { SpringApplication.run(consumer.class, args); } @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } }
@Service public class testService { @Autowired RestTemplate restTemplate; public String test(String name) { // 把服务提供者的spring.application.name填进来 + service名字 String str = restTemplate.getForObject("http://provider/test,String.class,name); return str; } }
五、集群高可用
注册中心这么关键的服务,如果是单点话,遇到故障就是毁灭性的。在一个分布式系统中,服务注册中心是最重要的基础部分,理应随时处于可以提供服务的状态。为了维持其可用性,使用集群是很好的解决方案。Eureka通过互相注册的方式来实现高可用的部署,所以我们只需要将Eureke Server配置其他可用的serviceUrl就能实现高可用部署。
在生产中我们可能需要三台或者大于三台的注册中心来保证服务的稳定性,配置的原理其实都一样,将注册中心分别指向其它的注册中心。这里只介绍三台集群的配置情况,其实和双节点的注册中心类似,每台注册中心分别又指向其它两个节点即可,使用application.yml来配置。
application.yml配置详情如下:
--- spring: application: name: spring-cloud-eureka profiles: peer1 server: port: 8000 eureka: instance: hostname: peer1 client: serviceUrl: defaultZone: http://peer2:8001/eureka/,http://peer3:8002/eureka/ --- spring: application: name: spring-cloud-eureka profiles: peer2 server: port: 8001 eureka: instance: hostname: peer2 client: serviceUrl: defaultZone: http://peer1:8000/eureka/,http://peer3:8002/eureka/ --- spring: application: name: spring-cloud-eureka profiles: peer3 server: port: 8002 eureka: instance: hostname: peer3 client: serviceUrl: defaultZone: http://peer1:8000/eureka/,http://peer2:8001/eureka/
分别以peer1、peer2、peer3的配置参数启动eureka注册中心。
java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2
java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer3
依次启动完成后,浏览器输入:http://localhost:8000/
效果图如下:
可以在peer1中看到了peer2、peer3的相关信息。至此eureka集群也已经完成了