SpringCloud的服务治理和负载均衡

一、Nacos Discovery--服务治理

最开始我们通过把服务提供者的网络地址 (ip,端口)等硬编码到了代码中的方法来实现微服务之间的调用,但是这种做法存在许多问题:

  1. 一旦服务提供者地址变化,就需要手工修改代码
  2. 一旦是多个服务提供者,无法实现负载均衡功能
  3. 一旦服务变得越来越多,人工维护调用关系困难

那么应该怎么解决呢, 这时候就需要通过注册中心动态的实现服务治理

什么是服务治理?

服务治理是微服务架构中最核心最基本的模块。用于实现各个微服务的自动化注册与发现。

服务注册是指向服务注册中心注册一个服务实例,服务提供者将自己的服务信息(如服务名、IP地址等)告知服务注册中心。

服务发现是指当服务消费者需要消费另外一个服务时,服务注册中心能够告知服务消费者它所要消费服务的实例信息(如服务名、IP地址等)。

通常情况下,一个服务既是服务提供者,也是服务消费者。服务消费者一般使用HTTP协议或者消息组件这种轻量级的通信机制来进行服务消费。

SpringCloud的服务治理和负载均衡_第1张图片

通过上面的调用图会发现,除了微服务,还有一个组件是服务注册中心,它是微服务架构非常重要

的一个组件,在微服务架构里主要起到了协调者的一个作用。

服务注册中心会提供服务的健康检查方案,检查被注册的服务是否可用。通常一个服务实例注册后,会定时向服务注册中心提供“心跳”,以表明自己还处于可用的状态。当一个服务实例停止向服务注册中心提供心跳一段时间后,服务注册中心会认为该服务实例不可用,会将该服务实例从服务注册列表中剔除。如果这个被剔除掉的服务实例过一段时间后继续向注册中心提供心跳,那么服务注册中心会将该服务实例重新加入服务注册中心的列表中。另外,微服务的服务注册组件都会提供服务的健康状况查看的UI界面,开发人员或者运维人员只需要登录相关的界面就可以知道服务的健康状态。

常见的注册中心--Nacos

Nacos是一个更易于构建云原生应用的动态服务发现配置管理服务管理平台。它是 Spring

Cloud Alibaba 组件之一,负责服务注册发现和服务配置,可以这样认为nacos=eureka+config

nacos实战入门

1: 安装nacos

下载地址: https://github.com/alibaba/nacos/releases

下载zip格式的安装包,然后进行解压缩操作

2: 启动nacos

#切换目录

cd nacos/bin

#命令启动

startup.cmd -m standalone

3: 访问nacos

打开浏览器输入http://localhost:8848/nacos,即可访问服务, 默认密码是nacos/nacos

将商品微服务注册到nacos中

1、在pom文件中添加nacos依赖

SpringCloud的服务治理和负载均衡_第2张图片

2、在主启动类中添加nacos注解

SpringCloud的服务治理和负载均衡_第3张图片

3、在配置文件中添加nacos的配置,配置注册中心的地址

4、启动服务,可以在nacos注册中心的控制面板中看到注册来的商品微服务

5、同样的方法,将订单微服务添加注册到nacos中

6、修改order微服务中OrderController层的代码:

public class OrderController_handwrite {
    @Resource
    private OrderService orderService;

    @Resource
    private RestTemplate restTemplate;

    @Autowired
    DiscoveryClient discoveryClient;

    @GetMapping("saveOrder")
    public String saveOrder(Long pid,Integer num){
        Order order=new Order();
        order.setNumber(num);
        order.setUid(1);
        order.setUsername("张三");
        order.setPid(pid);

        List instances = discoveryClient.getInstances("shop-product");
        ServiceInstance instance=instances.get(0);

        Product product=restTemplate.getForObject(instance.getUri()+"/product/findById/"+pid,Product.class);

        order.setPanme(product.getPname());
        order.setPprice(product.getPprice());

        orderService.saveOrder(order);

        return "下单成功";
    }

}

DiscoveryClient是专门负责服务注册和发现的,我们可以通过它获取到注册到注册中心的所有服

务。

7、启动服务, 观察nacos的控制面板中是否有注册上来的订单微服务,然后通过访问消费者服务验证调用是否成功 

SpringCloud的服务治理和负载均衡_第4张图片

二、实现服务调用的负载均衡

2.1 什么是负载均衡

负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上进行执行。 根据负载均衡发生位置的不同,一般分为服务端负载均衡客户端负载均衡。微服务调用关系中一般会选择客户端负载均衡,也就是在服务调用的一方来决定服务由哪个提供者执行

2.2 自定义实现负载均衡

2.2.1通过idea再启动一个 shop-product 微服务,设置其端口为8082

SpringCloud的服务治理和负载均衡_第5张图片

2.2.2 通过nacos查看微服务的启动情况

SpringCloud的服务治理和负载均衡_第6张图片

2.2.3 修改shop-order的代码实现负载均衡

@RestController
@RequestMapping("order")

public class OrderController_handwrite {
    @Resource
    private OrderService orderService;

    @Resource
    private RestTemplate restTemplate;

    @Autowired
    DiscoveryClient discoveryClient;

    @GetMapping("saveOrder")
    public String saveOrder(Long pid,Integer num){
        Order order=new Order();
        order.setNumber(num);
        order.setUid(1);
        order.setUsername("张三");
        order.setPid(pid);

        List instances = discoveryClient.getInstances("shop-product");
        ServiceInstance instance=instances.get(0);

        Product product=restTemplate.getForObject(instance.getUri()+"/product/findById/"+pid,Product.class);

        order.setPanme(product.getPname());
        order.setPprice(product.getPprice());

        orderService.saveOrder(order);

        return "下单成功";
    }

}

2.3 基于Ribbon实现负载均衡--组件

2.3.1.什么是Ribbon

Netflix 发布的一个负载均衡器,有助于控制 HTTP 和 TCP客户端行为。在 SpringCloud 中, nacos一般配合Ribbon进行使用,Ribbon提供了客户端负载均衡的功能,Ribbon利用从nacos中读 取到的服务信息,在调用服务节点提供的服务时,会合理(策略)的进行负载。 在SpringCloud中可以将注册中心和Ribbon配合使用,Ribbon自动的从注册中心中获取服务提供者的 列表信息,并基于内置的负载均衡算法,请求服务。

Netflix 发布的一个负载均衡器,Ribbon自动的从注册中心中获取服务提供者的 列表信息,并基于内置的负载均衡算法,请求服务。

2.3.2 Ribbon的主要作用

(1)服务调用

基于Ribbon实现服务调用, 是通过拉取到的所有服务列表组成(服务名-请求路径的)映射关系。借助 RestTemplate 最终进行调用

(2)负载均衡

当有多个服务提供者时,Ribbon可以根据负载均衡的算法自动的选择需要调用的服务地址

Ribbon是Spring Cloud的一个组件, 它可以让我们使用一个注解就能轻松的搞定负载均衡

使用方法

2.3.3.1 在RestTemplate的方法上添加@LoadBalanced注解

SpringCloud的服务治理和负载均衡_第7张图片

2.3.3.2  修改调用服务的方法

2.3.3.3 在配置中修改Ribbon的负载均衡策略,默认为依次进行,可以不改

SpringCloud的服务治理和负载均衡_第8张图片

2.4 基于OpenFeign实现服务调用

2.4.1 什么是OpenFeign

FeignSpring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地服务一样简单, 只需要创建一个接口并添加一个注解即可。

Nacos很好的兼容了Feign Feign负载均衡默认集成了 Ribbon, 所以在Nacos下使用Fegin默认就实现了负载均衡的效果。

OpenFeign的使用

步骤一:加入OpenFeign的依赖

SpringCloud的服务治理和负载均衡_第9张图片

步骤二:在主启动类中添加feign注解

SpringCloud的服务治理和负载均衡_第10张图片

步骤三:创建一个feign接口

@FeignClient(value = "shop-product")
public interface ProductFeign {
    @GetMapping("/product/findById/{pid}")
    public  Product findById(@PathVariable Long pid);
}

步骤四:修改OrderController的注解

@RestController
@RequestMapping("order")
public class OrderControllerOpenFeign {
    @Resource
    private OrderService orderService;

    @Autowired
    ProductFeign productFeign;

    @GetMapping("saveOrder")
    public String saveOrder(Long pid,Integer num){
        Order order=new Order();
        order.setNumber(num);
        order.setUid(1);
        order.setUsername("张三");
        order.setPid(pid);
        
        //重点在这里
        Product product= productFeign.findById(pid);

        order.setPanme(product.getPname());
        order.setPprice(product.getPprice());

        orderService.saveOrder(order);

        return "下单成功";
    }
}

你可能感兴趣的:(StudentNote)