Spring Cloud Alibaba Nacos服务治理平台,服务注册、RestTemplate实现微服务之间访问负载均衡访问的问题

目录
  • Nacos简介
    • ☘Spring Cloud 组件依赖版本
    • ☘Nacos部署
    • ☘访问Nacos平台
  • Nacos服务注册、微服务访问、负载均衡实现
    • nacos-consumer微服务创建
    • ☘nacos-provider微服务创建
  • 测试

Nacos简介

Github:https://github.com/alibaba/nacos
官网文档:https://nacos.io/zh-cn/docs/what-is-nacos.html
Nacos 提供了发现、配置和管理微服务能力,能快速实现动态服务发现、服务配置、服务元数据及流量管理。使用 Nacos 可以更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

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

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

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

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

☘Spring Cloud 组件依赖版本

官网文档:https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

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

☘Nacos部署

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

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

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

Windows

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

☘访问Nacos平台

默认账密:nacos/nacos

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

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

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-consumer

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

server.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;

/**
 * @author: ber
 * @date: 2022/6/25 0025 9:30
 * -------------------------------
 * Github:https://github.com/berbai
 * Blog:https://blog.csdn.net/Ber_Bai
 */
@SpringBootApplication
@EnableDiscoveryClient
public 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;

/**
 * @author: ber
 * @date: 2022/6/25 0025 10:58
 * -------------------------------
 * Github:https://github.com/berbai
 * Blog:https://blog.csdn.net/Ber_Bai
 */
@RestController
public class MsgController {

    private final RestTemplate restTemplate;

    @Autowired
    public MsgController(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    /**
     * 获取消息
     *
     * @param msgStr 消息
     * @return
     */
    @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=8892

spring.application.name=nacos-provider

spring.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;

/**
 * @author: ber
 * @date: 2022/6/25 0025 14:03
 * -------------------------------
 * Github:https://github.com/berbai
 * Blog:https://blog.csdn.net/Ber_Bai
 */
@EnableDiscoveryClient
@SpringBootApplication
public 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;

/**
 * @author: ber
 * @date: 2022/6/25 0025 14:06
 * -------------------------------
 * Github:https://github.com/berbai
 * Blog:https://blog.csdn.net/Ber_Bai
 */
@RestController
public 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;

/**
 * @author: ber
 * @date: 2022/6/25 0025 14:09
 * -------------------------------
 * Github:https://github.com/berbai
 * Blog:https://blog.csdn.net/Ber_Bai
 */
@Component
public 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;

/**
 * @author: ber
 * @date: 2022/6/25 0025 14:13
 * -------------------------------
 * Github:https://github.com/berbai
 * Blog:https://blog.csdn.net/Ber_Bai
 */
@Service
public 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 登陆后,可以发现服务列表中,两个微服务已经注册,如下图所示。

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

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

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

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

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

通过翻阅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;

/**
 * @author: ber
 * @date: 2022/6/25 0025 14:13
 * -------------------------------
 * Github:https://github.com/berbai
 * Blog:https://blog.csdn.net/Ber_Bai
 */
@Service
public class MsgService {

    @Autowired
    CountLog countLog;

    public Integer queryCount() {
        return countLog.getAtomicInteger().get();
    }

    public void addCount() {
        countLog.getAtomicInteger().addAndGet(1);
    }
}

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

到此这篇关于Spring Cloud Alibaba:Nacos服务治理平台,服务注册、RestTemplate实现微服务之间访问,负载均衡访问的文章就介绍到这了,更多相关Spring Cloud Alibaba Nacos服务内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringCloud Alibaba项目实战之nacos-server服务搭建过程

    目录 1.Nacos简介 1.1.什么是Nacos 1.2.Nacos基本原理 2.Nacos-Server服务部署 2.1.standalone 模式 2.2.cluster 模式 源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 大家好,我是三分恶. 这一节我们来学习SpringCloud Alibaba体系中一个非常重要的组件--Nacos. 1.Nacos简介 Nacos官方网站:https://nacos.io/zh-c

  • Spring cloud alibaba之Ribbon负载均衡方案

    目录 1.什么是Ribbon 1.1客户端的负载均衡 1.2服务器端的负载均衡 1.3常见负载均衡算法 2.Nacos使用Ribbon 3.Ribbon负载均衡策略 3.1常用负载均衡描述 3.3修改默认的负载均衡策略--配置文件的方式 3.4自定义负载均衡策略 4.使用spring cloud loadbalancer替代ribbon 1.什么是Ribbon 目前主流的负载均衡方案分为以下两种: (1)集中式负载均衡:在消费者和服务提供者中间使用独立的代理方式进行负载,有硬件的(F5),软件的

  • SpringCloud-Alibaba-Nacos启动失败解决方案

    下载及启动 Nacos 下载地址:https://github.com/alibaba/nacos/releases 在Windows下,进入bin目录,双击 startup.cmd 即可运行 启动出现问题 问题:双击 startup.cmd 启动失败,窗口一闪而过 你需要先去试试你的 Tomcat 能否启动:进入 Tomcat 安装目录 bin 文件夹,双击 startup.bat 如果能正常启动,出门右转,下面的不用看了

  • Spring Cloud Alibaba 之 Nacos教程详解

    Nacos 技术讲解 一提到分布式系统就不的不提一下 CAP 原则 Nacos简介 Nacos是阿里的一个开源产品,它是针对微服务架构中的服务发现.配置管理.服务治理的综合性解决方案. 官方介绍是这样的: Nacos致力于帮助您发现.配置和管理微服务.Nacos提供了一组简单易用的特性集,帮助您实现动态服务发现.服务配置管理.服务及流量管理.Nacos帮助您更敏捷和容易地构建.交付和管理微服务平台.Nacos是构建以"服务"为中心的现代应用架构的服务基础设施. 什么是CAP CAP原则

  • Spring Cloud Alibaba Nacos 入门详解

    概览 阿里巴巴在2018年7月份发布Nacos, Nacos是一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台.并表示在6-8个月完成到生产可用的0.8版本,目前版本是0.9版本. Nacos提供四大功能 服务发现和服务健康检查 Nacos使服务更容易注册自己并通过DNS或HTTP接口发现其他服务.Nacos还提供服务的实时健康检查,以防止向不健康的主机或服务实例发送请求. 动态配置管理 动态配置服务允许您在所有环境中以集中和动态的方式管理所有服务的配置.Nacos消除了在更新配置

  • 关于IDEA中spring-cloud-starter-alibaba-nacos-discovery 无法引入问题

    1.spring-cloud-starter-alibaba-nacos-discovery 这里依赖报红,无法引入,或显示无法找到,更换版本也无法解决,启动项目后nacos中也无法发现服务 ①错误显示unknown就需要加上版本号 2.解决 ①修改IDEA中的maven配置,把下面这个属性修改为Fail Fast(原来默认为default) ②给依赖加上版本 ③刷新maven,重启项目 3.查看nacos服务发现,就成功了 更多精彩内容关注公众号[Java技术迷] 到此这篇关于关于IDEA中s

  • Spring Cloud Alibaba Nacos服务治理平台,服务注册、RestTemplate实现微服务之间访问负载均衡访问的问题

    目录 Nacos简介 ☘Spring Cloud 组件依赖版本 ☘Nacos部署 ☘访问Nacos平台 Nacos服务注册.微服务访问.负载均衡实现 nacos-consumer微服务创建 ☘nacos-provider微服务创建 测试 Nacos简介 Github:https://github.com/alibaba/nacos官网文档:https://nacos.io/zh-cn/docs/what-is-nacos.htmlNacos 提供了发现.配置和管理微服务能力,能快速实现动态服务发

  • spring cloud alibaba Nacos 注册中心搭建过程详解

    这篇文章主要介绍了spring cloud alibaba Nacos 注册中心搭建过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 nacos下载地址 什么是 Nacos? nacos主要起到俩个作用一个是注册中心,另外一个是配置中心. 下面图 是nacos的功能结构图 运行环境 JDK 1.8+: Maven 3.2.x+: 下载 你可以通过源码和发行包两种方式来获取 Nacos. nacos发行包下载地址 选择版本解压 unzip

  • Spring Cloud Alibaba Nacos Config配置中心实现

    什么是 Nacos Config 在分布式系统中,由于服务数量巨多,为了方便服务 配置文件统一管理,实时更新,所以需要分布式配置中心组件. Spring Cloud Alibaba Nacos Config 是 Spring Cloud Config 的替代方案. Nacos Config 的存储配置功能为分布式系统中的外部化配置提供服务器端和客户端支持,可以在 Nacos 中集中管理 Spring Cloud 应用的外部属性配置. 引入依赖 在 pom.xml 中添加 spring-cloud

  • Spring Cloud Alibaba Nacos Config进阶使用

    目录 一.SpringBoot 使用 Nacos Config 实现多环境切换 1. 现象 2. 引入依赖 3. 添加bootstrap.yaml配置文件 4. 配置对应关系图 5. 文件格式简述 6. 启动nacos 8. 添加测试controller 9. 启动Springboot工程并观察到如下日志则为成功 10. 浏览器验证 11. 调整激活环境 12. 新建test环境配置 13. test配置关系图 14. 测试方法 15. 重启springboot服务,监控控制台输出 16. 浏览

  • Spring Cloud Alibaba Nacos两种检查机制

    目录 两种健康检查机制 如何设置健康检查机制? 客户端主动上报机制 服务端反向探测机制 TCP 探测 HTTP 探测 集群下的健康检查机制 总结 前言: Spring Cloud Alibaba Nacos 作为注册中心不止提供了服务注册和服务发现功能,它还提供了服务可用性监测的机制.有了此机制之后,Nacos 才能感知服务的健康状态,从而为服务调用者提供健康的服务实例,最终保证了业务系统能够正常的执行. 两种健康检查机制 Nacos 中提供了两种健康检查机制: 客户端主动上报机制. 服务器端反

  • Spring Cloud Alibaba Nacos Config加载配置详解流程

    目录 1.加载节点 2.NacosPropertySourceLocator的注册 3.加载 3.1.加载share 3.2.加载extention 3.3.加载主配置文件 1.加载节点 SpringBoot启动时,会执行这个方法:SpringApplication#run,这个方法中会调prepareContext来准备上下文,这个方法中调用了applyInitializers方法来执行实现了ApplicationContextInitializer接口的类的initialize方法.其中包括

  • IDEA 中 30 秒创建一个 Spring Cloud Alibaba 工程

    如果你想使用 Spring Cloud Alibaba,那么你遇到的第一个问题一定是如何快速的创建一个脚手架工程. 近日,阿里巴巴发布了 Spring 的国内脚手架定制版 Aliyun Java Initializer,因为全中文界面和流畅速度,被广大开发者热传.Spring 脚手架为开发者提供了丰富的可选组件,并且可以选择多种打包方式,大大方便了开发人员的使用.Web 端 Spring 脚手架可以帮助用户快速上手,但很多开发者也面临一个问题:在 Web 版本 Spring 脚手架生成工程最终要

  • 详解Spring Cloud Alibaba Sidecar多语言微服务异构

    自 Spring Cloud Alibaba 2.1.1 版本后增加了 spring-cloud-alibaba-sidecar 模块作为作为一个代理的服务来间接性的让其他语言可以使用spring cloud alibaba等相关组件.通过与网关的来进行路由的映射,从而可以做到服务的获取,然后可以使用Ribbon间接性调用. 如上图, Spring Cloud 应用 请求 sidercar 然后转发给其他语言的模块,优势是对于异构服务代码 零侵入,不需要直接根据 nacos 或其他注册中心 ap

随机推荐