1 本地负载均衡器基本概念
2,本地负载均衡器与nginx的区别
3,利用openfeign客户端实现rpc调用
4,Ribbon实现客户端负载均衡器源码解读
本地负载均衡器:
什么是本地负载均衡器: 我们的消费者从我们的注册中心上获取接口调用地址列表,本地实现负载均衡算法(轮询,随机,hash一致,权重)等原理,获取接口的列表,采用算法获取选择一个接口地址实现本地的rpc远程调用。
本地负载均衡器有: 自己写基于httpclient客户端,ribbon SpringCloud 第一代中,
loadbalancerSpringCloud 自己研发。
如何选择 ribbon 还是loadbalancer
SpringCloud Rest 或者Openfeign 都是默认支持ribbon
本地负载均衡器与nginx实现负载均衡器有哪些区别呢?
Nginx 属于服务器负载均衡器,客户端所有的请求都是统一交给我们的nginx,再由我们的nginx转发到我们的真实服务实现负载均衡。
本地负载均衡器: 属于客户端负载均衡
Nginx实现负载均衡与本地实现负载均衡器应用场景。
Nginx 实现对我们的服务器实现负载均衡器 一般用于tomcat、jetty服务器。
本地负载均衡器属于客户端负载均衡器,一般用于微服务rpc远程调用 比如dubbo,rest模板,openfeign 或者rpc远程调用框架。
SpringCloud rest 或者openfeign 客户端默认都是ribbon 实现调用。
@loadbalancer 实际上是我们的springcloud 自己写的
loadBlancerClientSpringCloud 根据服务id 获取id获取负载均衡器rpc地址。
Openfeign 客户端:
SpringCloud 第一代采用feign 第二代采用openfeign
openfeign 客户端作用: 是一个web声明式的http客户端远程调用工具。,底层是封装HttpClient 技术。
Openfeign 属于Springcloud自己研发,而feign是netflix 代码写法几乎没有任何变化。
真正的一个微服务架构 项目架构模式:
mayikt-meite-openfeign-parent---整个依赖父类
-----mayikt-service-api---开放的api接口 定义了接口没有任何代码业务实现。
--------mayikt-service-api-member---会员提供开放接口
--------mayikt-service-api-order---订单提供开放接口
-----mayikt-service-impl---对我们开放的api接口代码实现
--------mayikt-service-impl-member---会员提供开放接口
--------mayikt-service-impl-order---订单提供开放接口
微服务构建基本的样式,最大的优点是能够对我们feign 实现复用机制。
注意feign客户端调用的事项: 如果请求参数没有加上注解的话,默认采用post请求发送
Openfeign 默认支持负载均衡, ribbon
nacos 服务注册 服务名称是否 有下划线
在微服务架构中服务的名称不能有下划线。
Maven依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<dependencies>
<!-- springboot 整合web组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
</dependencies>
会员服务接口
public interface MemberService {
/**
* 提供会员接口
*
* @param userId
* @return
*/
@GetMapping("/getUser")
String getUser(@RequestParam("userId") Long userId);
}
@RestController
public class MemberServiceImpl implements MemberService {
@Value("${server.port}")
private String serverPort;
@Override
public String getUser(Long userId) {
return "我是会员服务端口号为:" + serverPort;
}
}
订单服务
@RestController
public class OrderService {
@Autowired
private MemberServiceFeign memberServiceFeign;
/**
* 订单调用会员
*
* @return
*/
@GetMapping("/orderToMember")
public String orderToMember() {
String result = memberServiceFeign.getUser(10L);
return "我是订单服务,调用会员服务接口返回结果:" + result;
}
}
@FeignClient(name = "meitemayikt-member")
public interface MemberServiceFeign extends MemberService {
// /**
// * 提供会员接口
// *
// * @param userId
// * @return
// */
// @GetMapping("/getUser")
// String getUser(@RequestParam("userId") Long userId);
}
微服务架构基本的样式 最大的优点能够对我们feign实现复用机制。
注意feign客户端调用的事项:如果请求参数没有加上注解的话,默认采用post请求发送。
Openfeign默认是支持负载均衡,ribbon。
网友评论