094:本地负载均衡器与opefeign声明式客户端调用工具
- 1 回顾上节课内容负载均衡器
- 2 本地负载均衡与Nginx区别
- 3 @LoadBalanced结合Rest
- 4 使用LoadBalancedClient实现负载
- 5 LoadBalanced实现的原理
- 6 openfeign客户端与feign客户端区别
- 7 如何采用idea构建微服务架构项目
- 8 使用openfeign客户端调用微服务接口
- 9 openfeign客户端调用命名规范
1 回顾上节课内容负载均衡器
课程内容:
- 本地负载均衡器基本概念
- 本地负载均衡器与Nginx的区别
- 利用openfeign客户端实现rpc调用
- Ribbon实现客户端负载均衡器源码分析
微服务中注册中心:管理服务接口地址,从而能够实现动态的调用。
2 本地负载均衡与Nginx区别
本地负载均衡器
什么是本地负载均衡器:消费者从注册中心上获取接口调用地址列表,本地实现负载均衡算法(轮询、随机、hash一致性、权重等)。
原理:获取接口地址列表,采用算法选择一个接口地址实现本地rpc远程调用。
本地负载均衡器有哪些: ribbon SpringCloud第一代Netflix组件、loadbalancer SpringCloud自己研发。
SpringCloud Rest或者Openfeign都是默认支持ribbon。
本地负载均衡器与Nginx实现负载均衡有哪些区别?
Nginx属于服务器端负载均衡器,客户端所有的请求都统一交给Nginx,再由nginx转发到真实服务实现负载均衡。
本地负载均衡器:属于客户端负载均衡。
应用场景
Nginx对服务器实现负载均衡器,一般用于tomcat/jetty服务器。
本地负载均衡器属于客户端负载均衡器,一般用于微服务rpc远程调用,比如dubbo、rest模版、openfeign或者rpc远程调用框架。
3 @LoadBalanced结合Rest
SpringCloud默认使用Ribbon负载均衡器
@RestController
public class OrderService {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/orderToRibbonMember")
public Object orderToRibbonMember() {
String result = restTemplate.getForObject("http://mayikt-member/getUser", String.class);
return "订单调用会员返回结果:" + result;
}
}
@SpringBootApplication
public class AppOrder {
public static void main(String[] args) {
SpringApplication.run(AppOrder.class);
}
/**
* 加上@LoadBalanced注解就可以实现本地负载均衡器
* @return
*/
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
测试结果:
4 使用LoadBalancedClient实现负载
SpringCloud rest或者openfeign客户端默认都是ribbon实现调用。
@loadbalancer实际上是springcloud自己写的。
SpringCloud中的LoadBalancerClient是根据服务id获取负载均衡器rpc地址。
@RestController
public class OrderService {
private LoadBalancerClient loadBalancerClient;
/**
* 根据loadBalancerClient实现客户端负载均衡
*
* @return
*/
@RequestMapping("/loadBalancerClientMember")
public Object loadBalancerClientMember() {
ServiceInstance result = loadBalancerClient.choose("mayikt-member");
return result;
}
}
测试结果:
5 LoadBalanced实现的原理
6 openfeign客户端与feign客户端区别
SpringCloud第一代采用feign,第二代采用openfeign
Openfeign客户端作用:是一个Web声明式的Http客户端远程远程调用工具,底层封装HttpClient技术。
Openfeign属于SpringCloud自己研发,而feign是netflix组件,代码写法几乎没有任何变化。
7 如何采用idea构建微服务架构项目
真正架构一个微服务项目 项目架构模式
mayikt-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客户端实现复用机制。
引入依赖
<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>
mayikt-service-api-member
public interface MemberService {
/**
* 提供发布的接口
* @param userId
* @return
*/
@GetMapping("/getUser")
String getUser(@RequestParam("userId") Integer userId);
}
mayikt-service-impl-member
application.yml
spring:
application:
## 服务名称
name: mayikt-member
cloud:
nacos:
discovery:
## nacos注册地址
server-addr: 127.0.0.1:8848
server:
port: 8080
会员服务
@RestController
public class MemberServiceImpl implements MemberService {
@Value("${server.port}")
private String serverPort;
@Override
public String getUser(Integer userId) {
return "我是会员服务,端口号为:" + serverPort;
}
}
@SpringBootApplication
public class AppMember {
public static void main(String[] args) {
SpringApplication.run(AppMember.class);
}
}
mayikt-service-impl-order
application.yml
spring:
application:
## 服务名称
name: mayikt-order
cloud:
nacos:
discovery:
## nacos注册地址
server-addr: 127.0.0.1:8848
server:
port: 8090
订单服务
@FeignClient("mayikt-member")
public interface MemberServiceFeign {
/**
* 提供发布的接口
* @param userId
* @return
*/
@GetMapping("/getUser")
String getUser(@RequestParam("userId") Integer userId);
}
@RestController
public class OrderService {
@Autowired
private MemberServiceFeign memberServiceFeign;
/**
* 基于feign客户端形式实现rpc远程调用
*
* @return
*/
@RequestMapping("/orderFeignToMember")
public String orderFeignToMember() {
String result = memberServiceFeign.getUser(1);
return "我是订单服务,调用会员服务的接口,返回结果:" + result;
}
}
@SpringBootApplication
@EnableFeignClients
public class AppOrder {
public static void main(String[] args) {
SpringApplication.run(AppOrder.class);
}
}
8 使用openfeign客户端调用微服务接口
注意feign客户端调用的事项:如果请求参数没有加上@RequestParam注解的话,默认采用post请求发送。
运行结果:
9 openfeign客户端调用命名规范
Nacos服务注册 服务名称是否可以有下划线 可以
但是在微服务架构中服务的名称命名不能够有下划线,openfeign客户端调用报错。