微服务架构-SpringCloudAlibaba-094:本地负载均衡器与opefeign声明式客户端调用工具

1 回顾上节课内容负载均衡器

课程内容:

  1. 本地负载均衡器基本概念
  2. 本地负载均衡器与Nginx的区别
  3. 利用openfeign客户端实现rpc调用
  4. 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客户端调用报错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值