返回顶部
首页 > 资讯 > 精选 >SpringCloud怎么实现微服务间负载均衡访问
  • 358
分享到

SpringCloud怎么实现微服务间负载均衡访问

2023-07-02 12:07:10 358人浏览 安东尼
摘要

本篇内容介绍了“SpringCloud怎么实现微服务间负载均衡访问”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Nacos简介Nacos 提

本篇内容介绍了“SpringCloud怎么实现微服务负载均衡访问”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    Nacos简介

    Nacos 提供了发现、配置和管理微服务能力,能快速实现动态服务发现、服务配置、服务元数据及流量管理。使用 Nacos 可以更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

    服务发现和服务健康监测
    Nacos 支持基于 DNS 和基于 rpc 的服务发现。服务提供者使用 原生SDK、Openapi、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或Http&API查找和发现服务。
    Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 tcp)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。

    动态配置服务
    动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
    动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
    配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
    Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

    动态 DNS 服务
    动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。
    Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.

    服务及其元数据管理
    Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

    spring cloud 组件依赖版本

    SpringCloud怎么实现微服务间负载均衡访问

    本文参考使用组件依赖如下

    SpringCloud怎么实现微服务间负载均衡访问

    ☘Nacos部署

    运行bin下的startup.cmd/startup.sh

    Nacos2.* 默认改为集群运行了,可以只用-m指令指定启动方式。

    windows

    rem 单机启动startup.cmd -m standalonerem 集群启动startup.cmd -m cluster

    ☘访问Nacos平台

    SpringCloud怎么实现微服务间负载均衡访问

    默认账密:nacos/nacos

    Nacos服务注册、微服务访问、负载均衡实现

    创建微服务项目,项目结构如下

    SpringCloud怎么实现微服务间负载均衡访问

    root pom.xml如下:

    <?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.ber</groupId>    <artifactId>springCloud</artifactId>    <version>1.0-SNAPSHOT</version>    <packaging>pom</packaging>    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>2.4.2</version>        <relativePath/>    </parent>    <properties>        <maven.compiler.source>8</maven.compiler.source>        <maven.compiler.target>8</maven.compiler.target>        <java.version>1.8</java.version>        <spring-boot.version>2.4.2</spring-boot.version>        <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>        <spring-cloud.version>2020.0.1</spring-cloud.version>    </properties>    <dependencies>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-bootstrap</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-openfeign</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-WEB</artifactId>        </dependency>    </dependencies>    <dependencyManagement>        <dependencies>            <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>            <dependency>                <groupId>org.springframework.cloud</groupId>                <artifactId>spring-cloud-dependencies</artifactId>                <version>${spring-cloud.version}</version>                <type>pom</type>                <scope>import</scope>            </dependency>        </dependencies>    </dependencyManagement>    <modules>        <module>ber-nacos</module>    </modules></project>

    nacos-consumer微服务创建

    nacos-comsumer pom.xml

    <?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">    <parent>        <artifactId>ber-nacos</artifactId>        <groupId>com.ber</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>    <artifactId>nacos-consumer</artifactId>    <description>服务消费</description>    <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>com.alibaba.cloud</groupId>            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>        </dependency>        <!-- 负载均衡 -->        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-loadbalancer</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-actuator</artifactId>        </dependency>    </dependencies></project>

    application.yml

    spring.application.name=nacos-consumerspring.cloud.nacos.discovery.server-addr=127.0.0.1:8848server.port=8891

    启动类
    记得在类上加上注解@EnableDiscoveryClient,RestTemplate属性注入增加 @LoadBalanced 注解(负载均衡)

    package com.ber.nacos.consumer;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.context.annotation.Bean;import org.springframework.web.client.RestTemplate;@SpringBootApplication@EnableDiscoveryClientpublic class NacosConsumerApplication {    @Bean    @LoadBalanced    RestTemplate initRestTemplate() {        return new RestTemplate();    }    public static void main(String[] args) {        SpringApplication.run(NacosConsumerApplication.class, args);    }}

    创建controller访问方法

    package com.ber.nacos.consumer.controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.*;import org.springframework.web.client.RestTemplate;@RestControllerpublic class MsGController {    private final RestTemplate restTemplate;    @Autowired    public MsgController(RestTemplate restTemplate) {        this.restTemplate = restTemplate;    }        @GetMapping("/queryMsg/{msgStr}")    public String getMsg(@PathVariable(value = "msgStr") String msgStr) {        return restTemplate.getForObject("http://nacos-provider/getMsg/" + msgStr, String.class);    }}

    ☘nacos-provider微服务创建

    nacos-provider pom.xml

    <?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">    <parent>        <artifactId>ber-nacos</artifactId>        <groupId>com.ber</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>    <packaging>jar</packaging>    <artifactId>nacos-provider</artifactId>    <description>服务提供</description>    <dependencies>        <dependency>            <groupId>com.alibaba.cloud</groupId>            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>        </dependency>    </dependencies></project>

    application.properties

    server.port=8892spring.application.name=nacos-providerspring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

    启动类

    package com.ber.nacos.provider;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@EnableDiscoveryClient@SpringBootApplicationpublic class NacosProviderApplication {    public static void main(String[] args) {        SpringApplication.run(NacosProviderApplication.class, args);    }}

    注解@EnableDiscoveryClient不要忘记加上。

    创建controller方法,被consumer访问的接口

    package com.ber.nacos.provider.controller;import com.ber.nacos.provider.service.MsgService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class MsgController {    @Autowired    MsgService msgService;    @GetMapping("getMsg/{msgStr}")    public String getMsg(@PathVariable(value = "msgStr") String msgStr) {        String res = "C服务";        System.out.println(res + " 调用"+msgService.queryCount()+"次");        msgService.addCount();        return res + " 调用" + msgService.queryCount() + "次 Get " + msgStr;    }}

    另外创建一个实体类记录consumer微服务访问provider微服务的次数

    package com.ber.nacos.provider.entity;import org.springframework.stereotype.Component;import java.util.concurrent.atomic.AtomicInteger;@Componentpublic class CountLog {    private AtomicInteger atomicInteger;    public CountLog(){        this.atomicInteger = new AtomicInteger();    }    public AtomicInteger getAtomicInteger() {        return atomicInteger;    }    public void setAtomicInteger(AtomicInteger atomicInteger) {        this.atomicInteger = atomicInteger;    }}

    创建操作访问次数的service方法

    package com.ber.nacos.provider.service;import com.ber.nacos.provider.entity.CountLog;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class MsgService {    @Autowired    CountLog countLog;    public Integer queryCount() {        return countLog.getAtomicInteger().get();    }    public void addCount() {        countLog.getAtomicInteger().addAndGet(1);    }}

    测试

    启动一个consumer和一个provider微服务,访问http://localhost:8848/nacos,使用 nacos/nacos 登陆后,可以发现服务列表中,两个微服务已经注册,如下图所示。

    SpringCloud怎么实现微服务间负载均衡访问

    访问http://localhost:8891/queryMsg/hello,即consumer的接口,可以得到如下图所示的界面

    SpringCloud怎么实现微服务间负载均衡访问

    再额外启动两个provider微服务,测试nacos的负载均衡能力,这里我修改了provider端口和接口返回的数据以标明不同的provider微服务。通过nacos控制平台可以看到三个provider微服务已经注册上去,如下图所示。

    SpringCloud怎么实现微服务间负载均衡访问

    SpringCloud怎么实现微服务间负载均衡访问

    再次请求http://localhost:8891/queryMsg/hello,可以发现每次请求接口,三个provider接口的内容会顺序出现,如下图所示。说明nacos默认的负载均衡方式是轮询

    SpringCloud怎么实现微服务间负载均衡访问

    通过nacos修改其中一个provider的权重,修改参考下图

    SpringCloud怎么实现微服务间负载均衡访问

    经过测试发现,负载策略还是轮询方式,本次修改无效。

    通过翻阅spring cloud alibaba源码,发现nacos实现了ribbon

    修改consumer的启动类,如下所示

    package com.ber.nacos.provider.service;import com.ber.nacos.provider.entity.CountLog;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class MsgService {    @Autowired    CountLog countLog;    public Integer queryCount() {        return countLog.getAtomicInteger().get();    }    public void addCount() {        countLog.getAtomicInteger().addAndGet(1);    }}

    重启consumer后,设置的权重已经生效。

    SpringCloud怎么实现微服务间负载均衡访问

    “SpringCloud怎么实现微服务间负载均衡访问”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    --结束END--

    本文标题: SpringCloud怎么实现微服务间负载均衡访问

    本文链接: https://www.lsjlt.com/news/342012.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • SpringCloud怎么实现微服务间负载均衡访问
      本篇内容介绍了“SpringCloud怎么实现微服务间负载均衡访问”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Nacos简介Nacos 提...
      99+
      2023-07-02
    • springcloud负载均衡怎么实现
      Spring Cloud提供了多种方式来实现负载均衡,常用的有以下几种方式:1. Ribbon:Ribbon是Spring Clou...
      99+
      2023-09-02
      springcloud 负载均衡
    • springcloud怎么实现负载均衡
      Spring Cloud中实现负载均衡,可以使用Ribbon和Feign两种方式。1. Ribbon负载均衡:Ribbon是一个客户...
      99+
      2023-08-26
      springcloud
    • SpringCloud怎么实现Ribbon负载均衡
      这篇文章主要讲解了“SpringCloud怎么实现Ribbon负载均衡”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringCloud怎么实现Ribbon负载均衡”吧!Ribbon使用R...
      99+
      2023-06-30
    • springcloud负载均衡策略怎么实现
      在Spring Cloud中,负载均衡策略的实现主要依赖于Ribbon和Eureka。Ribbon是Netflix开源的负载均衡组件...
      99+
      2023-09-27
      springcloud
    • springcloud负载均衡怎么搭建
      要搭建Spring Cloud负载均衡,你可以使用Ribbon作为负载均衡器。下面是搭建Spring Cloud负载均衡的步骤:1....
      99+
      2023-09-01
      springcloud 负载均衡
    • springcloud负载均衡怎么配置
      Spring Cloud提供了多种负载均衡的方式,可以通过在配置文件中配置相关参数来进行配置。 使用Ribbon负载均衡器: 在...
      99+
      2023-10-26
      springcloud
    • springcloud gateway怎么实现路由和负载均衡
      这篇文章将为大家详细讲解有关springcloud gateway怎么实现路由和负载均衡,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。简介:gateway主要是做路由 负载,过滤 主要是替代zuul 1....
      99+
      2023-06-20
    • SpringCloud 2020-Ribbon负载均衡服务调用的实现
      目录1、概述2、Ribbon负载均衡演示3、Ribbon核心组件IRule4、Ribbon负载均衡算法4.1 原理 + 源码4.2 手写负载均衡算法1、概述 官网:https://...
      99+
      2024-04-02
    • nginx负载均衡怎么用ip访问
      要使用ip访问nginx负载均衡,您可以按照以下步骤进行操作:1. 首先,您需要确保已经安装并配置了nginx服务器。您可以使用以下...
      99+
      2023-09-01
      负载均衡 nginx
    • SpringCloud如何实现Zuul集群(负载均衡)
      目录前言:一、使用 Nginx+Zuul 实现网关集群1.创建Eurek注册中心、会员服务、订单服务 (略)2. 创建Zuul服务3. 下载Nginx服务器二、 测试三、补充Ngin...
      99+
      2024-04-02
    • SpringCloud Zuul怎么实现负载均衡和熔断机制
      小编给大家分享一下SpringCloud Zuul怎么实现负载均衡和熔断机制,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、场景Zuul网关下实现其负载均衡与熔...
      99+
      2023-06-20
    • nginx负载均衡访问慢怎么解决
      如果使用Nginx进行负载均衡访问慢,可能是由于以下一些原因导致的:1. 后端服务响应慢:检查后端服务器的负载情况、网络连接状况以及...
      99+
      2023-09-07
      nginx 负载均衡
    • ssr服务器负载均衡怎么实现
      要实现SSR服务器的负载均衡,可以采用以下几种方法:1. DNS轮询:在DNS服务器上设置多个SSR服务器的IP地址,并采用轮询算法...
      99+
      2023-09-02
      ssr服务器 负载均衡 服务器
    • springcloud中Ribbon和RestTemplate实现服务调用与负载均衡
      文件目录结构 文件目录结构很重要,特别注意的是rule文件要放在主启动类上一级位置,才能够扫描。 写pom <dependencies> <!...
      99+
      2024-04-02
    • cdn负载均衡怎么实现
      cdn负载均衡的实现过程:采用专业负载均衡设备,当用户访问yisu.com时,首先要进行DNS解析,查出yisu.comd的IP地址,然后用户与该IP地址建立TCP连接访问网站内容,DNS流量分配方式工作在DNS解析过程中,通过在域yisu...
      99+
      2024-04-02
    • nginx怎么实现负载均衡
      要实现负载均衡,可以通过Nginx的反向代理和负载均衡模块来完成。以下是一种常见的配置方法:1. 安装Nginx:首先需要安装Ngi...
      99+
      2023-09-02
      nginx 负载均衡
    • mac负载均衡怎么实现
      在mac上实现负载均衡可以通过以下几种方式:1. 使用NAT(Network Address Translation)路由器:将多个...
      99+
      2023-09-01
      负载均衡
    • socket怎么实现负载均衡
      Socket负载均衡是通过将网络流量分发到多个服务器来实现的。以下是一种基于Socket的负载均衡实现方法:1. 设置一个负载均衡器...
      99+
      2023-09-07
      负载均衡 socket
    • apache怎么实现负载均衡
      要实现负载均衡,可以使用Apache的代理模块mod_proxy和mod_proxy_balancer。以下是一个简单的步骤:1. ...
      99+
      2023-09-07
      负载均衡 apache
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作