7天学会使用springcloud(二)
app-service
由于app-client端是调用服务消费者的门面,那就是说它只是个做转发的一个代理,那真正提供服务的是service,那client的调用怎么调用消费者的接口呢?
Spring cloud两种服务调用方式
在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的。
Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是feign。在这一篇文章首先讲解下基于ribbon+rest。
ribbon简介
Ribbon is a Inter Process Communication (remote procedure calls) library with built in software load balancers. The primary usage model involves REST calls with various serialization scheme support.
以上是来自官方的摘录介绍,我们来大致翻译一下:
ribboin是网络进程间通讯调用的库,它内置软件负载平衡器。主使用Rest模型调用,包括使用各种序列化方案支持的REST调用。
官网也罗列了以下几大功能:
paste image
负载均衡
容错
支持多协议异步和模型传输
缓存和批量执行(不知道这样翻译准不准确)
ribbon是一个负载均衡客户端,可以很好的控制http和tcp的一些行为。Feign默认集成了ribbon。
ribbon 已经默认实现了这些配置bean:
IClientConfig ribbonClientConfig: DefaultClientConfigImpl
IRule ribbonRule: ZoneAvoidanceRule
IPing ribbonPing: NoOpPing
ServerList ribbonServerList: ConfigurationBasedServerList
ServerListFilter ribbonServerListFilter: ZonePreferenceServerListFilter
ILoadBalancer ribbonLoadBalancer: ZoneAwareLoadBalancer
建立服务消费者
重新新建一个spring-boot工程,取名为:app-service;
在它的pom.xml文件分别引入起步依赖spring-cloud-starter-eureka、spring-cloud-starter-ribbon、spring-boot-starter-web
pom.xml:
application.yml:
支持loadBalance
在service端的Application启动类上加上restTemplate注入:
在配置robbion的负载均衡的时候,发现一个很诡异的事情,通过service就是无法通过service id 去访问client端:
调用的时候一直报连接拒绝:
paste image
经过我反复实验,发现是因为app-client端没有设置访问根目录,则需要在配置文件里server后面加上子项servlet.contextPath = /
bootstrap.xml:
加上后重启app-client,然后通过server id 访问,就通了。。。。
注:有时候app-client重启了还不行,可能还需要重启sever注册中心
再访问就可以了:
paste image
我们来看看他的负载均衡,再新增一台client实例
application.yml:
将service的端口号改成9000
paste image
发现负载均衡起效了。。。。。
下一章节讲下robbin和zull的结合使用。
领取专属 10元无门槛券
私享最新 技术干货