- 设有B服务,其名称为
service-b
,A服务,其名称为servcie-a
,要使B可以通过A服务的名称service-a来调用A的接口,则需要B和A都互相认识,即知道彼此的名称, 这就需要一个共享的存在,这个存在就是服务注册与发现组件。这类组件有Eureka
和consul
等。 - 如果没有服务注册与发现组件,则通过名称调用接口时,会报
java.net.UnknownHostException
异常。 - 只能通过
IP+端口
调用才能正常,所以从这个角度说,服务注册与发现组件也体现了类似DNS
的作用。 - 如何将服务注册到
consul
中,参看服务consul-demo-producer
和consul-demo-consumer
的依赖配置。
服务消费者 service-b
通过 RestTemplate + Ribbon
方式来调用服务生产者 service-a
的 rest
接口。
Ribbon是Spring Cloud中的负载均衡客户端,Spring Cloud Ribbon
会从服务注册中心(Consul
或Eureka
)服务器端上获取服务注册信息列表,缓存到本地,实现负载均衡策略。
客户端将所有请求统一交给nginx
,由nginx
实现负载均衡请求转发,属于服务器端负载均衡。
Ribbon
是从服务注册中心服务端上获取服务注册信息列表,缓存到要地,然后在本地实现负载均衡策略,即客户端实现负载均衡。
服务消费者 service-c
通过 Feign
方式来调用服务生产者 service-a
的 rest
接口。
- 在微服务中,由于网络原因或自身原因,服务并不能保证100%可用,如果单个服务出现问题,比如
service-a
出现问题,service-b
在调用service-a
时就会出现线程阻塞,此时若service-b
有大量请求调用,则service-b
的Servlet
容器的线程资源会被消耗完毕,导致服务瘫痪。 - 服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的后果,这就是服务故障的“雪崩”效应。
- 为了解决这个“雪崩”问题,就出现了**断路器(circuit breaker)**模型。
- Spring Cloud 中的断路器是
Hystrix
,即spring-cloud-starter--netflix-hystrix
依赖。
具体看服务消费者 service-b
具体看服务消费者 service-c
微服务架构中,为了避免客户端与多个微服务之间的请求复杂性,需要一个介于客户端和各个微服务器端之间的中间层,这个中间层就是微服务网关。Spring Cloud体系中用到的微服务网关是 Zuul
。微服务网关的主要功能是路由转发和过滤器。
- 路由转发:默认情况下,
Zuul
会代理所有注册到注册中心如consul
或Eureka
上的微服务,且Zuul
的路由规则如下:http://ZUUL_HOST:ZULL_PORT/serviceId/**
会被转发到serviceId
对应的微服务。其中serviceId
指的是微服务注册在注册中心上的serviceId
。- 可以进行多种方式的路由配置,如配置需要忽略的服务,配置同时指定微服务的
serviceId
和对应路径等 - 可将
com.netflix
包的日志级别设为DEBUG
,这样可以打印路由转发的具体细节,有助于理解Zuul
的路由配置,如logging: level: com.netfilx: DEBUG
。
- 可以进行多种方式的路由配置,如配置需要忽略的服务,配置同时指定微服务的
- 过滤器:编写过滤器只需继承抽象类
ZuulFilter
,然后实现几个抽象方法就可以了。
微服务网关服务工程参看service-gateway-zuul
。
将分布式配置中心做成一个微服务 config-server
,注册到服务注册中心如 consul
,并集群化,从而达到高可用。
需要读取配置中心配置的服务如 config-client
,就可以只通过配置中心的服务名 config-server
来读取配置了,这时如果配置中心服务 config-server
部署多份,通过负载均衡,从而高可用。通过配置中心服务名来读取配置参看项目 config-client
。