SpringCloud服务治理介绍&Nacos安装及实现负载均衡

目录

一、服务治理简介

二、nacos简介

三、nacos下载&安装

四、nacos实现负载均衡


一、服务治理简介

通过上一章的操作,我们已经可以实现微服务之间的调用。但是我们把服务提供者的网络地址 (ip,端口)等硬编码到了代码中,这种做法存在许多问题:

  • 一旦服务提供者地址变化,就需要手工修改代码

  • 一旦是多个服务提供者,无法实现负载均衡功能

  • 一旦服务变得越来越多,人工维护调用关系困难

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

1.1什么是服务治理?

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

SpringCloud服务治理介绍&Nacos安装及实现负载均衡_第1张图片

1.2注册中心的作用?

通过上面的调用图会发现,除了微服务,还有一个组件是服务注册中心,它是微服务架构非常重要 的一个组件,在微服务架构里主要起到了协调者的一个作用。注册中心一般包含如下几个功能:

服务发现:

  • 服务注册:保存服务提供者和服务调用者的信息

  • 服务订阅(发现):服务调用者订阅服务提供者的信息,注册中心向订阅者推送提供者的信息

服务配置:

  • 配置订阅:服务提供者和服务调用者订阅微服务相关的配置

  • 配置下发:主动将配置推送给服务提供者和服务调用者

服务健康检测

  • 检测服务提供者的健康情况,如果发现异常,执行服务剔除

1.3常见的注册中心有哪些?

  • Zookeeper zookeeper是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式 应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用 配置项的管理等。

  • Eureka Eureka是Springcloud Netflix中的重要组件,主要作用就是做服务注册和发现。但是现在已经闭 源

  • Consul Consul是基于GO语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现 和配置管理的功能。Consul的功能都很实用,其中包括:服务注册/发现、健康检查、Key/Value 存储、多数据中心和分布式一致性保证等特性。Consul本身只是一个二进制的可执行文件,所以 安装和部署都非常简单,只需要从官网下载后,在执行对应的启动脚本即可。

  • Nacos Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它是 Spring Cloud Alibaba 组件之一,负责服务注册发现和服务配置,可以这样认为nacos=eureka+config。

二、nacos简介

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速 实现动态服务发现、服务配置、服务元数据及流量管理。 从上面的介绍就可以看出,nacos的作用就是一个注册中心,用来管理注册上来的各个微服务。

三、nacos下载&安装

3.1下载地址

https://github.com/alibaba/nacos/releases

SpringCloud服务治理介绍&Nacos安装及实现负载均衡_第2张图片

3.2安装步骤

①下载好压缩包进行解压

SpringCloud服务治理介绍&Nacos安装及实现负载均衡_第3张图片

②修改bin目录下的startup.cmd文件

SpringCloud服务治理介绍&Nacos安装及实现负载均衡_第4张图片

③直接修改startup.cmd文件:set MODE="standalone"

④启动Nacos

修改startup.cmd后直接双击运行打开

SpringCloud服务治理介绍&Nacos安装及实现负载均衡_第5张图片

⑤直接访问nacos

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

SpringCloud服务治理介绍&Nacos安装及实现负载均衡_第6张图片SpringCloud服务治理介绍&Nacos安装及实现负载均衡_第7张图片

 到这里我们的nacos的下载及安装就完成了!

四、nacos实现负载均衡

我们接下来实现使用Nacos注册中心来解决负载均衡的问题,俺么首先第一步就是需要将我们所创建的微服务注册到Nacos中去

4.1将微服务注册到Nacos

这里就以商品微服务为例子:

在父模块中是否导入了alibaba的Pom依赖



    4.0.0

    com.zq
    springcloud-shop
    1.0-SNAPSHOT
    
        shop-common
        shop-user
        shop-product
        shop-order
    
    pom
    
    
        1.8
        UTF-8
        UTF-8
        2.3.2.RELEASE
        Hoxton.SR9
        2.2.6.RELEASE
    

    
        
            
            
                org.springframework.boot
                spring-boot-dependencies
                ${spring-boot.version}
                pom
                import
            
            
            
                org.springframework.cloud
                spring-cloud-dependencies
                ${spring-cloud.version}
                pom
                import
            
            
            
                com.alibaba.cloud
                spring-cloud-alibaba-dependencies
                ${spring-cloud-alibaba.version}
                pom
                import
            
        
    

②在shop-common模块的pom.xml中添加nacos的依赖



	com.alibaba.cloud
	spring-cloud-starter-alibaba-nacos-discovery

③ 在主类上添加@EnableDiscoveryClient注解

SpringCloud服务治理介绍&Nacos安装及实现负载均衡_第8张图片

④在application.yml中添加nacos服务的地址

SpringCloud服务治理介绍&Nacos安装及实现负载均衡_第9张图片

⑤启动服务, 观察nacos的控制面板中是否有注册上来的商品微服务

SpringCloud服务治理介绍&Nacos安装及实现负载均衡_第10张图片

因为小编是直接将三个微服务全都注册了,所以这里Nacos会显示三个列表

4.2DiscoveryClient实现负载均衡

接下来实现负载均衡的三种方式来了,首先是最原始的一种DiscoveryClient

①我们先使用idea赋值一个商品微服务

SpringCloud服务治理介绍&Nacos安装及实现负载均衡_第11张图片

SpringCloud服务治理介绍&Nacos安装及实现负载均衡_第12张图片

SpringCloud服务治理介绍&Nacos安装及实现负载均衡_第13张图片

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

我们启动复制的微服务,那么shop-product也会在Nacos中注册多一个

SpringCloud服务治理介绍&Nacos安装及实现负载均衡_第14张图片

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

package com.zq.shoporder.controller;

import com.zq.entity.Order;
import com.zq.entity.Product;
import com.zq.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;
import java.util.Random;

/**
 * @author张强
 * @site www.zq.com
 * @create  2022-11-25 15:35
 */
@RequestMapping("/order")
@RestController
public class OrderController {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient;

    @RequestMapping("/get/{uid}/{pid}")
    public Order get(@PathVariable("uid") Integer uid,
                     @PathVariable("pid") Integer pid){
        User user = restTemplate.getForObject("http://localhost:8070/user/get/" + uid, User.class);

        //从nacos中获取服务地址
        //自定义规则实现随机挑选服务
        List instances = discoveryClient.getInstances("shop-product");
        int index = new Random().nextInt(instances.size());
        ServiceInstance serviceInstance = instances.get(index);
        String url = serviceInstance.getHost() + ":" +
                serviceInstance.getPort();
        //通过restTemplate调用商品微服务
        Product product = restTemplate.getForObject("http://" + url +
                "/product/get/" + pid, Product.class);
        Order order = new Order();
        order.setNumber(2);
        order.setOid(System.currentTimeMillis());
        order.setPid(pid);
        order.setPname(product.getPname());
        order.setPprice(product.getPprice() * order.getNumber());
        order.setUid(user.getUid());
        order.setUsername(user.getUsername());
        return order;
    }
}

  ④测试查看端口号每次访问是不是有不一样

结果发现访问product 的微服务成功实现负载均衡!

4.3Ribbon实现负载均衡

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

①在RestTemplate 的生成方法上添加@LoadBalanced注解

@Bean@LoadBalancedpublic RestTemplate restTemplate() {    return new RestTemplate();}

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

注意:SpringCloud服务治理介绍&Nacos安装及实现负载均衡_第15张图片

package com.zq.shoporder.controller;

import com.zq.entity.Order;
import com.zq.entity.Product;
import com.zq.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @author张强
 * @site www.zq.com
 * @create  2022-11-25 15:35
 */
@RequestMapping("/order")
@RestController
public class OrderController {

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/get/{uid}/{pid}")
    public Order get(@PathVariable("uid") Integer uid,
                     @PathVariable("pid") Integer pid){

        String url = "shop-product";
        String url2 ="shop-user";
        User user = restTemplate.getForObject("http://"+url2+"/user/get/" + uid, User.class);
        //通过restTemplate调用商品微服务
        Product product = restTemplate.getForObject("http://"+url+"/user/get/" + pid, Product.class);
        Order order = new Order();
        order.setNumber(2);
        order.setOid(System.currentTimeMillis());
        order.setPid(pid);
        order.setPname(product.getPname());
        order.setPprice(product.getPprice() * order.getNumber());
        order.setUid(user.getUid());
        order.setUsername(user.getUsername());
        return order;
    }
}

 4.4基于Feign实现负载均衡

Feign是Spring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地服务 一样简单, 只需要创建一个接口并添加一个注解即可。 Nacos很好的兼容了Feign, Feign默认集成了 Ribbon, 所以在Nacos下使用Fegin默认就实现了负 载均衡的效果。

①加入Fegin的依赖



	org.springframework.cloud
	spring-cloud-starter-openfeign

②在主类上添加Fegin的注解

SpringCloud服务治理介绍&Nacos安装及实现负载均衡_第16张图片

③创建一个service, 并使用Fegin实现微服务调用

package com.zq.shoporder.service;

import com.zq.entity.Product;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient("shop-product")//声明调用的提供者的name
public interface ProductService {
    //指定调用提供者的哪个方法
    //@FeignClient+@GetMapping 就是一个完整的请求路径
    //http://serviceproduct/product/{pid}
    @GetMapping(value = "/product/get/{pid}")
    Product findByPid(@PathVariable("pid") Integer pid);
}

④修改controller代码,并启动验证

package com.zq.shoporder.controller;

import com.zq.entity.Order;
import com.zq.entity.Product;
import com.zq.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @author张强
 * @site www.zq.com
 * @create  2022-11-25 15:35
 */
@RequestMapping("/order")
@RestController
public class OrderController {

    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    public  ProductService productService;

    @RequestMapping("/get/{uid}/{pid}")
    public Order get(@PathVariable("uid") Integer uid,
                     @PathVariable("pid") Integer pid){

        String url = "shop-product";
        String url2 ="shop-user";
        User user = restTemplate.getForObject("http://"+url2+"/user/get/" + uid, User.class);
        //通过restTemplate调用商品微服务
        Product product = productService.get(pid);
        Order order = new Order();
        order.setNumber(2);
        order.setOid(System.currentTimeMillis());
        order.setPid(pid);
        order.setPname(product.getPname());
        order.setPprice(product.getPprice() * order.getNumber());
        order.setUid(user.getUid());
        order.setUsername(user.getUsername());
        return order;
    }
}

 4.5Feign参数传递

在使用Feign用作服务注册时作为后台需要注意一下几点

  1. 基本数据类型参数需要带上@PathVariable("uid")注解
  2. 对象参数需要加上@RequestBody注释
@RequestMapping("/findByParameter2")
    public String findByParameter2(
            @RequestParam("name") String name,
            @RequestParam("price") Double price){
        log.info("服务提供者日志:{},{}",name,price);
        return "hello:"+name+price;
    }

 @RequestMapping("/findByRequestBody")
    public Product findByRequestBody(@RequestBody Product product){
        log.info("服务提供者日志:{}",product.getPname());
        return product;
    }

你可能感兴趣的:(spring,cloud,负载均衡,java)