一、相关组件说明:1.eureka: 实现服务的注册和发现的功能。并提供服务的健康监测,以及友好的UI。类似组件Consul和zookeeper。 在server(高可用需要集群)启动类添加注解@EnableEurekaServer
application.properties配置文件
server.port=8761 eureka.instance.hostname=localhost eureka.client.serviceUrl.defaultZone=eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
# 防止自己注册自己 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false
在client启动类添加注解@EnableEurekaClient application.properties配置文件:
server.port=8762
# 服务注册地址,指向server的设置地址,要保持与上面的eureka.client.serviceUrl.defaultZone保持一致 eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/ spring.application.name=eureka-client
2.ribbon: 负载均衡。通常和eureka、Zuul、RestTemplate(或者feign)配合使用。 ribbon和Zuul配合使用,很容易做到负载均衡,将请求根据负载均衡策略分配到不同的服务实例中 ribbon和restTemplate、feign结合使用,在消费服务时能够做到负载均衡。
3.feign 声明式调用: 个人理解,与restTemplate属于同级组件,feign能使http请求更简单(一个标签就可以) 使用feign与ribbon结合,实现负载均衡:
启动类添加注解:@EnableEurekaClient @SpringBootApplication @EnableFeignClients
创建接口,并与server调用接口内的方法,由controller暴露API接口,request请求该服务的controller。/** * value为远程调用其他服务的服务名 * feignConfig.class为feign client的配置类 * fallback为熔断器接口 * @author gaoshiliang */ @FeignClient(value = "eureka-client" , configuration = FeignConfig.class , fallback = EurekaClientFeignHystrixImp.class) public interface EurekaClientFeign {
/** * 通过feign来调用eureka-client服务的“/hi”的API接口 * @param name * @return */ @GetMapping("/hi") String sayHiFromClientEureka(@RequestParam(value = "name") String name) ; }
使用restTemplate与ribbon结合,实现负载均衡:
@Service public class RibbonService {
@Autowired RestTemplate restTemplate ; /** * 对该方法使用熔断器,当访问地址无法调用时,会执行hiError方法 * 当eureka-client不可用时,开启熔断器,最后进入fallbackMethod逻辑 * 这样做可以通过快速失败,请求能够得到及时处理,线程不在阻塞 * @param name * @return */ @HystrixCommand(fallbackMethod = "hiError") public String hi(String name) { return restTemplate.getForObject("http://eureka-client/hi?name="+name, String.class) ; } public String hiError(String name) { return "hi," + name + ",sorry, error!" ; }
4.Hystrix熔断器 设计原则:
防止单个服务的故障耗尽整个服务的servlet容器(如Tomcat的线程资源;快速失败机制,如果某个服务出现了故障,则调用该服务的请求快速失败,而不是线程等待;提供回退(fallback方案,在请求发生故障时,提供设定好的回退方案;使用熔断机制,防止故障扩散到其他服务;提供熔断器的监控组件hystrix dashbord,可以实施监控熔断器的状态。工作机制
如上图:
当某个服务的某个API接口的失败次数在一定时间内小于设定的阈值时,熔断器处于关闭状态,该API接口能够正常提供服务。当该API接口处理请求的失败次数大于设定的阈值时,Hystrix判定该API出现了故障,打开熔断器,这时请求该API接口会执行快速失败的逻辑,即fallback,不执行业务逻辑,请求的线程不会处于阻塞状态。处于打开状态的熔断器,一段时间后会处于半打开转态,将部分请求执行业务逻辑,其余则快速返回失败。若正常执行业务逻辑的请求失败了,则熔断器继续开启,若成功,则关闭熔断器,这样熔断器就有了自我修复的能力。5.zuul路由网关 作用如下:
Zuul、ribbon以及Eureka相结合,可以实现智能路由和负载均衡的功能,Zuul能够将请求流量某种策 略分发到集群的多个服务实例。网关将所的API接口统一聚合,并统一对外暴露。外界系统调用API接口时,都是网关对外暴露的API接口,外界系统不需要知道微服务系统中各服务相互调用的复杂性。微服务也起到了保护器内部微服务单元的API接口,防止其被外界直接调用,导致服务的敏感信息对外暴露。网关服务可以做用户身份信息认证和权限人质,防止非法请求操作API接口,对服务器起到保护作用。网关可以实现监控功能,实时日志输出,对请求进行记录。网关可以用来实现流量监控,在高流量的情况下,对服务进行降级。API接口从内部服务分离出来,方便做测试。