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

news2025/1/20 3:52:14

目录

一、服务治理简介

二、nacos简介

三、nacos下载&安装

四、nacos实现负载均衡


一、服务治理简介

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

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

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

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

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

1.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

3.2安装步骤

①下载好压缩包进行解压

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

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

④启动Nacos

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

⑤直接访问nacos

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

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

四、nacos实现负载均衡

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

4.1将微服务注册到Nacos

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

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

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zq</groupId>
    <artifactId>springcloud-shop</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>shop-common</module>
        <module>shop-user</module>
        <module>shop-product</module>
        <module>shop-order</module>
    </modules>
    <packaging>pom</packaging>
    <!--依赖版本的锁定-->
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.2.RELEASE</spring-boot.version>
        <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
        <spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- SpringBoot 依赖配置 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- Springcloud 依赖配置 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- Springcloud alibaba 依赖配置 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

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

<!--nacos客户端-->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

③ 在主类上添加@EnableDiscoveryClient注解

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

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

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

4.2DiscoveryClient实现负载均衡

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

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

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

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

 ③ 修改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<ServiceInstance> 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 的代码,实现负载均衡

注意:

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的依赖

<!--fegin组件-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

②在主类上添加Fegin的注解

③创建一个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;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/44069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于PHP+MySQL大连真爱果汁厂管理系统的设计与实现

果汁是以水果为原料经过物理方法如压榨、离心、萃取等得到的汁液产品。长期的饮用果汁不仅可以让我们大饱口福而且能够增加免疫力,减少生病,延缓衰老,甚至一些果汁还有美容养颜的功效,果汁中富含多种矿物质和有机酸为此深受各类人群的喜欢,随着人们健康意识的增加,人们对果汁的…

双十二投影仪推荐 三分钟告诉你怎么挑选到称心如意的投影仪

作为家庭沉浸式观影的必备神器&#xff0c;投影仪越来越受大众的喜爱&#xff0c;今天就让我们一起来看看双十二投影仪推荐&#xff0c;双十二高性价比投影仪选购指南&#xff0c;双十二卧室投影怎么选&#xff1f;2022双十二热门投影仪推荐&#xff0c;这8款投影仪总有一款适合…

华为云会议,轻松实现远程智能办公

说到云会议&#xff0c;很多人首先想到的应该就是华为云会议&#xff01;华为云会议基于华为近30年的音视频技术&#xff0c;结合华为IdeaHub等全系列智能协作终端&#xff0c;为客户提供全场景端云协同视频会议解决方案&#xff0c;满足跨地区、跨企业、跨终端的智能沟通协作需…

聚L-精氨酸/纳米金/石墨烯/聚苯胺复合膜/铝粉/稀土粒子修饰多巴胺的制备

小编这里给大家分享的科研内容是聚L-精氨酸/纳米金/石墨烯/聚苯胺复合膜/铝粉/稀土粒子修饰多巴胺的制备&#xff0c;和小编一起来看! 聚L-精氨酸/纳米金修饰多巴胺的制备&#xff1a; 利用多电位脉冲沉积法制备纳米金修饰电极 (AuNPs/GCE),再将L-精氨酸电聚合在AuNPs/GCE表面…

Kotlin高仿微信-项目实践58篇

Kotlin高仿微信项目实践主要包含5大模块&#xff1a; 1、Web服务器 2、Kotlin客户端 3、Xmpp即时通讯服务器 4、视频通话服务器 5、腾讯云服务器 另外也有Flutter版本高仿微信功能&#xff0c;Flutter版本跟Kotlin同时开发&#xff0c;调用的是同一个服务器接口。 每天只…

【原创】关于表结构更改的大量数据的迁移方案

前言 由于公司要求做产品之间的对接&#xff0c;需要统一表结构和字段名&#xff0c;但是有些表有上亿条数据&#xff0c;如果直接修改表字段名和加字段每一条SQL都要执行大量时间&#xff0c;大概时间为加一个字段1.5小时/1亿条数据&#xff0c;这耗时实在太长了&#xff0c;…

GitHub价值1w的Java最新面试宝典(附答案解析)被我弄到手了

为了能够帮助更多Java岗位同学就业&#xff0c;小编淘来了GitHub上最新Java面试宝典&#xff0c;本套题库均来自海量真实校招面试题目大数据进行的整理&#xff0c;学完这个题库&#xff0c;把此题库都理解透彻应对各家企业面试完全没有问题。&#xff08;当然要加上好的项目以…

Hosmer-Lemeshow检验(HL检验)

Hosmer-Lemeshow检验&#xff08;HL检验&#xff09;为模型拟合指标&#xff0c;其原理在于判断预测值与真实值之间的gap情况&#xff0c;如果p值大于0.05&#xff0c;则说明通过HL检验&#xff0c;即说明预测值与真实值之间并无非常明显的差异。反之如果p值小于0.05&#xff0…

操作系统:处理机调度与死锁 练习题(带有解析和答案)

文章目录1.处理机调度的层次和调度算法的目标1.1.处理机调度的层次1.2.处理机调度算法的目标求解周转时间和带权周转时间例题2.作业与作业调度2.1.批处理系统中的作业2.2.作业调度的主要任务2.3.先来先服务和短作业优先调度算法2.4.优先级调度算法和高响应比调度算法3.进程调度…

基于ASPNET+SQL的医院在线预约平台系统的设计与开发

本论文介绍的主要内容是从武警警官医院在线预约平台系统的需求分析到详细设计,最后到测试部分的整个过程。其实现主要功能有患者信息、医务人员、科室信息的管理和在线咨询、在线预约信息管理等五个主要模块。系统实现了用户信息在线管理、浏览以及在线咨询与预约信息的交互和数…

Node2vec

引言 这篇论文可以说是对DeepWalk的扩展&#xff0c;按照LINE的说法&#xff0c;DeepWalk只捕捉了节点间的二阶相似性。LINE同时捕捉节点间的一阶相似性和二阶相似性。而Node2Vec同时也是同时捕捉一阶相似性和二阶相似性。和LINE不同的是&#xff0c;Node2Vec是基于Random Wal…

SpringCloudGateWay个人笔记

核心概念&#xff1a; Route&#xff08;路由&#xff09;&#xff1a; 路由是构建⽹关的基本模块&#xff0c;它由ID&#xff0c;⽬标URI&#xff0c;⼀系列的断⾔和过滤器组成&#xff0c;如果断⾔为true就 匹配该路由。Predicate&#xff08;断⾔、谓词&#xff09;&#xf…

D-018 LED硬件电路设计

LED硬件电路设计1 简介2 LED的参数3 驱动方式3.1 定电压驱动3.2 定电流驱动4 应用场景5 设计要点1 简介 发光二极管&#xff08;简称LED&#xff09;,是一种发光的电子器件&#xff0c;能将电能转换为光能。这种器件不仅发光效率高&#xff0c;而且节能、寿命长。LED会议波长来…

SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)

代码资源位置&#xff1a;F:\workspace\SpringMVC代码\springMVC-demo4 1、RESTful简介 REST&#xff1a;Representational State Transfer&#xff0c;表现层资源状态转移。 a>资源 资源是一种看待服务器的方式&#xff0c;即&#xff0c;将服务器看作是由很多离散的资源组…

C语言 指针与数组

C语言 指针与数组引言1. 指针与数组之间的联系2. 指针与字符串之间的联系一、指针与数组1. 对比两者的区别2. 指针数组的用法3. 数组指针的用法二、数组参数、指针参数1. 一维数组传参2. 二维数组传参三、指针与函数 (了解)1. 其实函数也有地址2. 函数指针3. 函数指针数组4. qs…

03_SpringBoot项目配置

文章目录SpringBoot项目配置0x01_properties格式配置文件0x02_yml格式配置文件配置对象类型数据配置集合类型配置数组类型0x03_properties和yml的区别优先级区别0x04_配置文件在项目中的位置0x05_bootstrap配置文件0x06_springboot项目结构SpringBoot项目配置 SpringBoot默认读…

Mysql数据库和SQL语句

一、数据库介绍&安装 1. 什么数据库软件 在前期学习的过程中&#xff0c;对于数据的保存方式有两种体现&#xff1a; 一种是将数据保存到本地的文件中&#xff0c;优点是可以持久保存&#xff0c;但是数据管理查询等相当麻烦。 一种是将数据保存到本地的内存中&#xff0c…

Linux学习记录——삼 基本指令(3)及了解权限

接着上一篇把一些基本命令写完 unzip解压默认解压到当前目录&#xff0c;加上-d后面跟路径就可以解压到指定目的地 tar指令 不同文件格式的压缩指令&#xff0c;可以直接看内容&#xff0c;不需要打开。tar后面有几个指令选项。-c表示创建压缩文件&#xff0c;-z打包并压缩&am…

E. Matrix and Shifts(思维+遍历正对角线)

Problem - 1660E - Codeforces 你会得到一个大小为nn的二进制矩阵A。行从上到下从1到n编号&#xff0c;列从左到右从1到n编号&#xff0c;位于第i行和第j列交点的元素称为Aij。考虑一组4个操作。 循环地将所有行向上移动。索引为i的行将被写在i-1行的位置上&#xff08;2≤i≤…

文件权限概念,相关操作

一&#xff0c;文件权限的基本概念 权限&#xff1a;操作系统限制对资源访问的一种机制。 文件权限的信息展示&#xff0c;使用ls -l 命令即可查看&#xff1a; 整个文件信息可以分为以下几部分&#xff1a; &#xff08;一&#xff09;第一个字段表示文件类型 和 文件权限。…