1.在Eureka上注册的信息有:ip,端口,serviceId
2.注册信息缓存默认30秒
3.安全模块,配置用户名和密码防止人家随意登录
4.底层用定时任务每30秒去检测一侧客户端
5.服务注册和获取服务列表都是REST方式
ribbon的负载均衡策略:
轮询、随机(策略可以单独的对一个服务设置)
ribbon可以脱离Eureka单独使用(RestTemplate上面添加@LoadBalanced,eureka-server里面包含了ribbon的包)
Feign是声明式的http客户端,就不需要用restTemplate(不需要再在每个微服务接口去配置地址了),只需一个接口定义一下行了
它也是注册在Eureka客户端
引入:spring-cloud-starter-openfeign包
(主方法添加@EnableFeignClients,添加一个接口配上@FeignClient和服务名称以及路径;然后在controller里面调用这个方法)
hystrix
服务雪崩:某一个微服务有问题,逐渐占满了所有资源;导致其它微服务也不可用。
解决方案:1.超时机制(默认是1秒左右) 2.服务限流 3.服务熔断(默认20次失败就熔断,熔断时间过了之后就半开;成功访问之后就恢复) 4.服务降级(默认10个线程降级,还可以配一个组共享多少线程)
引入:spring-cloud-starter-netflix-hystrix 包,主方法添加@EnableCircuitBreaker,需要熔断的方法添加@HystrixCommand(fallbackMethod = "findByIdFallback") , findByIdFallback是熔断后返回的方法,返回值要与熔断的方法一致
hystrix整合feign,由于feign是接口式声明,而且feign默认依赖了hystrix的包,直接在接口上添加熔断的注解,名字是:接口.class,然后写一个受保护的类部类实现这个接口,实现的方法就是降级的方法;也可以配置hystrix不启用。
Spring Boot 2.0 下 hystrix.stream 404 问题,参考:http://www.voidcc.com/content/spring-boot-hystrix-stream-404
dashborad:hystrix监控中心(只能监控用feign的接口 feign下面依赖了hystrix-core;这个是没有界面的只有hystrix大包才有监控 的功能),turbine是监控所有配置好的(dashborad是监控单独的)。
spring-cloud-starter-actuator(健康监控),springboot-admin 监控还可以发送邮件、短信等(例如服务挂了)
Eureka集群:多个server相互注册,然后它们会相互复制客户端注册信息;本地测试需要ip需要配上host来测试;
windows配host地址:C:\Windows\System32\drivers\etc\hosts
zuul:默认整合了ribbon和hystrix等组件,相当于把客户端和微服务解耦,客户端通过zuul来访问后端的微服务,zuul的hystrix只能对后端的一整个微服务做熔断、限流、降级等,暂时不支持对微服务中的api。(访问的时候注意serviceId是小写)
为什么要用网关:
# 客户端会多次请求不同微服务,增加客户端的复杂性
# 存在跨域请求,在一定场景下处理相对复杂
# 认证复杂,每一个服务都需要独立认证
# 难以重构,随着项目的迭代,可能需要重新划分微服务,如果客户端直接和微服务通信,那么重构会难以实施
# 某些微服务可能使用了其他协议,直接访问有一定困难
架构图:
高可用:通过nginx转发配置的多个zuul
config 分布式配置中心:
在代码仓库配置信息,客户端去拿不同版本或者不同分支的配置
spring-cloud-config配置git地址的时候,properties要在git地址的第一个目录下,不然找不到,访问的时候会是404
config server可以加解密,防止密码泄露
spring-cloud-bus:其它微服务监听bus,修改之后其它每个微服务拉取自己的配置文件; bus通过mq发送消息
高可用:同zuul原理一样(git也要搭多个高可用,getHub本身就是高可用)
sleuth分布式调用链:微服务在很多的情况下,出了问题很难定位问题,分布式链路通过跟踪每一次的调用,以便查找问题
(引入了sleuth的jar包之后,还需要在配置文件里面配置sleuth都日志打印,不然控制台不会打印)
sleuth通过zipkin存储数据(数据存的是内存) trace(一个完整的调用) space(其中一个小模块调用)
zipkin是一个单独的项目作为手机链路数据用,客户端调用的数据传到这个服务上,如果要持久化,一般用es(持久到es上)。
访问zipkin都时候不要用 http://localhost:9411/zipkin , 要用 http://localhost:9411/zipkin/