服务发现
- 服务发现是Eureka的服务器,引入这个服务,在Application上加入 @EnableEurekaServer即可,无需任何其他操作。
- 每个服务配置一个application name,方便区分。
- 多个可以构建成集群,相互注册。
spring:
application:
name: eureka1-server
profiles: first
server:
port: 9001
eureka:
instance:
hostname: eureka1
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka2:9002/eureka/,http://eureka3:9003/eureka/
服务器注册
- 注册只要在Application上加上 @EnableDiscoveryClient即可
- 同样需要一个ApplicationName
- 需要指明有哪些euraka注册服务器可用
eureka:
client:
service-url:
defaultZone: http://eureka1:9001/eureka/,http://eureka2:9002/eureka/,http://eureka3:9003/eureka/
动态路由
- 使用动态路由,原因是前面调用方,并不想知道哪些具体的服务可用,对调用方来说最好一个地址就可以。
- 动态路由类似Nginx的作用,对服务进行反向代理。
- Zuul可以根据url配置哪些url使用哪些服务,而这些服务可以是eureka上的服务,这样就实现了动态路由。
- Application加上@EnableZuulProxy即可
- 配置路由规则
#route test1
zuul.routes.test1.path=/test1/**
zuul.routes.test1.serviceId=TEST1
也可以用
zuul.routes.test1.url=http://localhost
我倾向于用前者,这样可以利用eureka的动态服务表
* 使用eureka服务获取服务列表
eureka.client.service-url.defaultZone=http://eureka1:9001/eureka/,http://eureka2:9002/eureka/,http://eureka3:9003/eureka/
这里有个小问题,服务注册到eureka上后,名称都变成了大写,在zuul里面的serviceId也必须大写,否则找不到
很显然,zuul可以配置多个实现负载均衡和故障转移。
- zuul的可用性也是个问题。如果有高可用的负载均衡器,可以在前面放一个,调用方访问负载均衡器,这样一个zuul挂了就自动故障迁移了。比如一些云服务提供的SLB
断路器
- 可以在服务不可用或者延迟很大的时候,直接fail,避免系统雪崩。
- 可以用在远程调用上,也可以用在普通方法上。
- @FeignClient直接支持断路器
- @HystrixCommand 标注一个断路器
FeignClient
注解式的远程REST调用,把调用转换成一个接口,而不是RestTemplate调用。
* 注解式声明REST调用
* 直接和Eureka Server接通,调用上面的服务。
* 支持断路器
* @EnableEurekaClient 从Eureka上获取服务列表
* @EnableFeignClients 支持FeigeClients
* @FeignClient(value = “test1”,fallback = TestClientFallback.class) 支持Fallback
* Java调用REST,首选用FeignClient
* 其他程序比如php,通过zuul调用