前言
参考资料:
《Spring Microservices in Action》
《Spring Cloud Alibaba 微服务原理与实战》
《B站 尚硅谷 SpringCloud 框架开发教程 周阳》
服务调用是在注册中心的基础之上,解决应该调用哪个服务实例的问题;
1. 服务调用基础知识
1.1 常见的负载均衡方案
正向代理:
- 正向代理是一个位于客户端和原始服务器 (origin server) 之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端;
- 客户端必须要进行一些特别的设置才能使用正向代理;
- 常用于:访问原来无法访问的资源;做缓存加速访问资源;对客户端访问授权,上网进行认证;记录用户访问记录(上网行为管理),对外隐藏用户信息等;
反向代理:
- 反向代理实际运行方式是指以代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器;
- 常用于:保证内网的安全,可以使用反向代理提供WAF功能,阻止 Web 攻击; 大型网站,通常将反向代理作为公网访问地址,Web 服务器是内网;负载均衡,通过反向代理服务器来优化网站的负载;
1.2 Spring Cloud的 Netflix Ribbon 和 Feign 的区别
- Ribbon 是一个基于 HTTP 和 TCP 客户端的负载均衡器。它可以在客户端配置 RibbonServerList(服务端列表),然后轮询请求以实现均衡负载。它在联合 Eureka 使用时 RibbonServerList 会被 DiscoveryEnabledNIWSServerList 重写,扩展成从 Eureka 注册中心获取服务端列表同时,它也会用 NIWSDiscoveryPing 来取代 IPing,它将职责委托给 Eureka 来确定服务端是否已经启动。 使用 HttpClient 或 RestTemplate 模拟 HTTP 请求,步骤相当繁琐;
- Feign 是在 Ribbon 的基础上进行了一次改进,是一个使用起来更加方便的 HTTP 客户端。采用接口的方式, 只需要创建一个接口,面向接口,然后在上面添加注解即可 。将需要调用的其他服务的方法定义成抽象方法即可, 不需要自己构建 HTTP 请求。然后就像是调用自身工程的方法调用,而感觉不到是调用远程方法,使得编写客户端变得非常容易。类似于 MyBatis 的 @Mapper 注解;
1.1 目前几种流行的服务调用组件对比
名称 | 厂商 | 特点(优点) | 缺点 |
---|---|---|---|
Ribbon | Netflix | 客户端负载均衡 | 开发较为复杂 |
Feign 与 OpenFeign | Spring Cloud | 对 Ribbon 进行封装 |
2. Ribbon
Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡的工具;提供客户端的软件负载均衡算法和服务调用;
3. Feign 与 OpenFeign
Feign 是一个声明式的 Web 服务客户端,让编写 Web 服务客户端变得非常容易,只需创建一个接口并在接口上添加注解即可;