关于微服务调用所需组件的总结

微服务中fegin调用 常用微服务调用组件_SpringCloud


本文中微服务服务端、微服务客户端、微服务的概念解释:

微服务服务端:由多个微服务客户端的注册组成,又称微服务客户端注册中心

微服务客户端:实现具体的微服务,注册到微服务服务端后可发现和订阅注册中心中其他的微服务客户端;并通过编码可调用其他微服务客户端中的微服务

微服务:rest服务,由微服务客户端实现,可供其他微服务客户端进行远程调用

以下的总结以一个微服务服务端EurekaServer(注册中心) 和 两个微服务客户端EurekaClientA、EurekaClientB的环境来说明

一、服务的注册
将EurekaClientB(微服务客户端),注册到EurekaServer注册中心(微服务服务端)后

微服务客户端在注册中心注册的服务名可通过配置文件指定,例:

eureka.client.instance.appname : EurekaClientB #配置微服务客户端在注册中心注册的名称


spring.application.name : EurekaClientB #后者比前者的优先级高,同时存在则覆盖前者

该服务名将提供给其他微服务客户端来进行对该微服务客户端的订阅和微服务调用(微服务调用其实

就是一个微服务客户端对另一个微服务客户端发起的rest服务调用)

二、服务的拉取和订阅

场景:EurekaClientA向EurekaClientB发起微服务的调用

调用地址:http://EurekaClientB/user/getByUserId

地址说明:http://微服务名/rest服务地址

说明:微服务客户端在注册中心注册的的微服务名是EurekaClientB,那么其他微服务客户端在调用

其微服务的时候,调用的url的domain就是它的微服务名EurekaClientB,后面再跟上需要调用的微服

务映射的地址 例如:/user/getByUserId 即可;这里重申一遍本文微服务概念:微服务就是一个可供

其他微服务客户端调用的rest服务的url地址。EurekaClientA发起对EurekaClientB的微服务调用时,

根据url中提供的信息在微服务服务端(微服务注册中心)拉取对应的微服务客户端EurekaClientB并订阅

它;

三、微服务的调用(RestTemplate)
紧接着第二节的场景说明,在EurekaClientA向EurekaClientB发起微服务的调用时,代码层面

EurekaClientA就是通过RestTemplate来调用http://EurekaClientB/user/getByUserId这个url地址的

四、微服务的调用:负载均衡(RestTemplate+Ribbon)
微服务负载均衡后可能会由多个相同的微服务客户端实现,那么就会发生多个微服务客户端在注册中

心注册的是相同的微服务名(它们都实现了相同的微服务),不过ip地址肯定是不一样的。发起微服务

调用的一方就可能拉取到多个微服务客户端列表并订阅;之后进行负载均衡算法确定最终需要调用的

微服务,这件事由Ribbon来完成;按第二节的场景来说,如果微服务存在多个微服务客户端实现,微

服务名为EurekaClientB,即EurekaClientA可能获取到多个名为EurekaClientB微服务客户端列表,并

缓存到微服务本地;如果微服务服务端宕机无法获取到微服务列表,则可靠本地的缓存的列表继续进

行微服务的调用,保证微服务的可用性。

五、简化微服务调用:接口伪装(Feign)
调用地址:http://EurekaClientB/user/getByUserId 借用第二节的场景用Feign来说明以上这个微服务的调用:

Feign是简化以后的RestTemplate+Ribbon(当然还可以结合更多其他组件使用比如hystrix等);通过

@FeignClient注解可以在EurekaClientA中标识某个接口的实现由EurekaClientB微服务客户端来实现

@FeignClient(name=“EurekaClientB”) //微服务名:指定该接口由注册中心中的哪个微服务客户端

来实现;之后在接口中将需要实现EurekaClientB的rest服务的方法写上@RequestMapping并填写映

射地址;该接口的签名、参数、返回值等描述信息必须和EurekaClientB中rest服务一模一样。Feign

会生成该接口的代理实现类,该代理实现类中会根据注解提供的信息将接口中的方法代理实现;

注意:使用feign需要在启动类上注解@EnableFeignClient声明这是一个需要使用feign进行微服务调用的工程。最后大概说一下feign微服务调用的思路:

1、生成接口的代理实现类,并将实现类注入IOC
2、根据@FeignClient填写的服务名确定微服务客户端再根据接口中的@RequestMapping提供的路径生成rest微服务请求地址
3、Feign拉取rest服务列表
3、同样使用Ribbon实现微服务负载均衡选中一个微服务客户端,RestTemplate来具体实现对微服务客户端的微服务调用

最后我发现:微服务调用,最简单的目的无非就是要构建一个微服务的url的地址 交给微服务客户端的resttemplate去调用而已;
至于注册中心、负载均衡、接口伪装都只是根据需要附加上去的设计。