前言
本文是根据蚂蚁课堂余胜军老师的课程所做笔记,记录的要点,部分自己的理解可能有所偏差,不当之处会进行修改。
本地负载均衡器
本地负载均衡器负责从注册中心上获取接口调用地址列表,本地实现负载均衡算法。
原理:获取接口地址列表,采用算法获取一个接口地址实现本地rpc远程调用。
本地负载均衡器与Nginx实现负载均衡器的区别
Nginx属于服务器负载均衡器,客户端所有的请求都统一交给Nginx,再由Nginx转发到真实服务实现负载均衡。
本地负载均衡器:属于客户端负载均衡。
应用场景:
- Nginx实现对服务器的负载均衡,一般用于tomcat/jetty服务器
- 本地负载均衡器属于客户端负载均衡器,一般用于微服务rpc远程调用,比如dubbo、openfeign等。
LoadBalanced结合Rest
@GetMapping("/orderRibbonToMember")
public Object orderRibbonToMember() {
//通过服务地址加上方法名调用,String.class为方法返回值类型
String object = restTemplate.getForObject("http://member-nacos/user", String.class);
return "调用返回结果"+object;
}
restTemplate通过服务名来访问,restTemplate上要加上@LoadBalanced注解来实现负载均衡,底层使用的是ribbon。自动完成了通过服务名获取调用地址列表,并选择一个进行调用的功能。
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
使用LoadBalancerClient实现负载
LoadBalancerClient已经注册,可直接注入使用
@GetMapping("/orderLoadBalancerClient")
public Object orderLoadBalancerClient() {
//根据服务名通过负载均衡算法获得服务实例
ServiceInstance choose = loadBalancerClient.choose("member-nacos");
return choose;
}
Openfeign客户端
SpringCloud第一代采用的是feign,第二代采用openfeign。
Openfeign客户端是一个Web声明式的Http客户端远程调用工具,底层封装了HttpClient技术。
feign是netflix研发,而openfeign是SpringCloud自己研发的,但在使用上的代码写法几乎是一致的。
在项目本地创建一个对应于要远程调用的服务的接口,然后使用@FeignClient注解。注意,要使用@EnableFeignClients开启openfeign
导入openfeign的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
在service-api-member模块下有一个供调用的服务接口
public interface MemberService {
@GetMapping("/user")
String getUser();
}
在service-impl-member模块下实现上面的接口。(接口方法的注解会被实现类的方法继承)
@RestController
public class MemberServiceImpl implements MemberService {
@Override
public String getUser() {
return "会员服务调用";
}
}
我们要在service-order模块中调用MemberService的实现方法。
MemberService的实现模块的服务名为member-service。在service-order中创建接口对应于MemberService,使用@FeignClient根据服务名可获取调用地址并且已经实现了负载均衡。
@FeignClient("member-service")
public interface MemberServiceFeign {
@GetMapping("/user")
String getUser();
}
这样我们在service-order里使用MemberServiceFeign接口中的方法就可以调用MemberService的实现类的方法。
@RestController
public class OrderService {
@Autowired
private MemberServiceFeign memberServiceFeign;
@GetMapping("orderFeignToMember")
public String orderFeignToMember() {
String user = memberServiceFeign.getUser();
return user;
}
}
注意feign客户端调用的事项:如果请求参数没有加上注解的话,默认采用post请求
Nacso服务注册 服务名称命名不能有下划线,feign获取服务时,服务名有下划线会报错。