当前位置: 代码迷 >> 综合 >> SpringCloudAlibaba-Nacos服务注册与配置中心
  详细解决方案

SpringCloudAlibaba-Nacos服务注册与配置中心

热度:71   发布时间:2024-03-06 18:37:51.0

目录

    • Nacos简介
    • Nacos 快速开始
      • 1. 下载源码
      • 2. 启动服务
    • 服务注册
      • 1. 创建一个micro-order的module
      • 2. 引入依赖
      • 3. 配置文件
      • 4. 创建启动类
      • 5. 创建一个controller
      • 6. 启动服务
    • 负载均衡
      • 1. 创建一个micro-web的module
      • 2. 引入依赖
      • 3. 配置文件
      • 4. 创建启动类
      • 5. 创建controller
      • 6. 启动服务
      • 7. 服务调用
    • 配置中心
      • 1. 引入依赖
      • 2. 配置文件
      • 3. 修改controller
      • 4. 添加配置
        • properties
        • yaml

Nacos简介

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

Nacos 的关键特性包括:

  • 服务发现和服务健康监测:Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。
  • 动态配置服务:动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
  • 动态 DNS 服务:动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。
  • 服务及其元数据管理:Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

nacos官网https://nacos.io/zh-cn/docs/what-is-nacos.html

Nacos 快速开始

可以参考官网https://nacos.io/zh-cn/docs/quick-start.html

1. 下载源码

  • 因为github下载的速度特别慢,这里使用gitee的国内镜像下载源码,这里使用官方建议的1.3.1稳定版本

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 进入nacos目录,执行mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U

在这里插入图片描述

2. 启动服务

  • 到Nacos\distribution\target\nacos-server-1.3.1\nacos\bin目录下找到startup.cmd

在这里插入图片描述

  • 右键编辑,如果是单机使用,必须是standalone,如果是集群使用,是cluster

在这里插入图片描述

  • 双击启动

在这里插入图片描述

  • 启动成功

-

  • 访问http://localhost:8848/nacos,用户名密码默认都是nacos

在这里插入图片描述
在这里插入图片描述

服务注册

参考官方文档https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery

1. 创建一个micro-order的module

在这里插入图片描述

2. 引入依赖

  • 版本之间需要匹配

在这里插入图片描述

<?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>org.example</groupId><artifactId>micro-order</artifactId><version>1.0-SNAPSHOT</version><name>micro-order</name><!-- FIXME change it to the project's website --><url>http://www.example.com</url><!--使用了springboot就要引入这个--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.7</maven.compiler.source><maven.compiler.target>1.7</maven.compiler.target><!--springcloud版本号--><spring.cloud.version>Hoxton.SR1</spring.cloud.version><!--springcloudalibaba版本号--><spring.cloud.alibaba.version>2.2.3.RELEASE</spring.cloud.alibaba.version></properties><dependencyManagement><dependencies><!--需要springcloud组件支撑需要引入这个--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring.cloud.version}</version><type>pom</type><scope>import</scope></dependency><!--需要springcloudalibaba组件支撑需要引入这个--><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><dependencies><!--web启动--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--健康检查--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!--服务注册--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--配置中心--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies><build><pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --><plugins><!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle --><plugin><artifactId>maven-clean-plugin</artifactId><version>3.1.0</version></plugin><!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging --><plugin><artifactId>maven-resources-plugin</artifactId><version>3.0.2</version></plugin><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.8.0</version></plugin><plugin><artifactId>maven-surefire-plugin</artifactId><version>2.22.1</version></plugin><plugin><artifactId>maven-jar-plugin</artifactId><version>3.0.2</version></plugin><plugin><artifactId>maven-install-plugin</artifactId><version>2.5.2</version></plugin><plugin><artifactId>maven-deploy-plugin</artifactId><version>2.8.2</version></plugin><!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle --><plugin><artifactId>maven-site-plugin</artifactId><version>3.7.1</version></plugin><plugin><artifactId>maven-project-info-reports-plugin</artifactId><version>3.0.0</version></plugin></plugins></pluginManagement></build>
</project>

3. 配置文件

  • 使用bootstrap.properties,后面使用nacos作为注册中心要求文件名必须是bootstrap,不能使用application
  • 指定端口号,服务名称,nacos地址,开放全部请求端点

在这里插入图片描述

server.port=8081
spring.application.name=micro-order
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*

4. 创建启动类

  • 开启服务注册功能@EnableDiscoveryClient

在这里插入图片描述

package org.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
@EnableDiscoveryClient
public class MicroOrderApplication {
    public static void main(String[] args) {
    SpringApplication.run(MicroOrderApplication.class, args);}
}

5. 创建一个controller

package org.example.Controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Slf4j
@RestController
public class UserController {
    @RequestMapping("/queryUser")public String queryUser(HttpServletRequest request, HttpServletResponse response) {
    log.info("========micro-order===queryUser");return "========micro-order===queryUser" + request.getServerPort();}}

6. 启动服务

在这里插入图片描述

  • 刷新服务列表

在这里插入图片描述

  • 再启动一个服务,使用8082端口

在这里插入图片描述

  • 创建一个启动类MicroOrderApplication2使用8082端口再次启动

在这里插入图片描述
在这里插入图片描述

  • 刷新服务列表,这时候有2个实例了

在这里插入图片描述
在这里插入图片描述

负载均衡

1. 创建一个micro-web的module

在这里插入图片描述

2. 引入依赖

<?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>org.example</groupId><artifactId>micro-web</artifactId><version>1.0-SNAPSHOT</version><name>micro-web</name><!-- FIXME change it to the project's website --><url>http://www.example.com</url><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.7</maven.compiler.source><maven.compiler.target>1.7</maven.compiler.target><!--springcloud版本号--><spring.cloud.version>Hoxton.SR1</spring.cloud.version><!--springcloudalibaba版本号--><spring.cloud.alibaba.version>2.2.3.RELEASE</spring.cloud.alibaba.version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring.cloud.version}</version><type>pom</type><scope>import</scope></dependency><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><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies><build><pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --><plugins><!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle --><plugin><artifactId>maven-clean-plugin</artifactId><version>3.1.0</version></plugin><!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging --><plugin><artifactId>maven-resources-plugin</artifactId><version>3.0.2</version></plugin><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.8.0</version></plugin><plugin><artifactId>maven-surefire-plugin</artifactId><version>2.22.1</version></plugin><plugin><artifactId>maven-jar-plugin</artifactId><version>3.0.2</version></plugin><plugin><artifactId>maven-install-plugin</artifactId><version>2.5.2</version></plugin><plugin><artifactId>maven-deploy-plugin</artifactId><version>2.8.2</version></plugin><!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle --><plugin><artifactId>maven-site-plugin</artifactId><version>3.7.1</version></plugin><plugin><artifactId>maven-project-info-reports-plugin</artifactId><version>3.0.0</version></plugin></plugins></pluginManagement></build>
</project>

3. 配置文件

在这里插入图片描述

server.port=8091
spring.application.name=micro-web
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*

4. 创建启动类

  • 使用带有负载均衡的RestTemplate

在这里插入图片描述

package org.example;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
@EnableDiscoveryClient
public class MicroWebAppliaction {
    //开启负载均衡@Bean@LoadBalancedRestTemplate restTemplate() {
    //http请求客户端return new RestTemplate();}public static void main(String[] args) {
    SpringApplication.run(MicroWebAppliaction.class, args);}
}

5. 创建controller

在这里插入图片描述

package org.example.Controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@Slf4j
@RestController
public class UserController {
    //指定调用的服务名称private static String SERVER_NAME = "micro-order";@AutowiredRestTemplate restTemplate;@RequestMapping(value = "/queryUser")public String queryUser() {
    String result = restTemplate.getForObject("http://" + SERVER_NAME+ "/queryUser", String.class);log.info(result);return result;}
}

6. 启动服务

在这里插入图片描述
在这里插入图片描述

7. 服务调用

  • 第一次请求http://localhost:8091/queryUser,请求到了8082端口的micro-order

在这里插入图片描述
在这里插入图片描述

  • 第二次请求http://localhost:8091/queryUser,请求到了8081端口的micro-order

在这里插入图片描述
在这里插入图片描述

  • 这里是默认的轮询负载均衡策略

配置中心

参考官网https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config

1. 引入依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2. 配置文件

在这里插入图片描述

spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.file-extension=properties

3. 修改controller

  • 返回从配置中心获得的值

在这里插入图片描述

package org.example.Controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;//动态刷新
@RefreshScope
@Slf4j
@RestController
public class UserController {
    //获取配置中心的值@Value("${server-name}")private String serverName;//获取配置中心的值@AutowiredEnvironment environment;@RequestMapping("/queryUser")public String queryUser(HttpServletRequest request, HttpServletResponse response) {
    log.info("========micro-order===queryUser");return "serverName=" +serverName+";environmentValue="+environment.getProperty("server-name");}}

4. 添加配置

properties

1、micro-order

  • Data Id使用服务名称,不带properties后缀

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 对应的配置文件

在这里插入图片描述

  • 启动服务,请求http://localhost:8081/queryUser,查看打印

在这里插入图片描述
2、micro-order.properties

在这里插入图片描述
在这里插入图片描述

  • 再次请求http://localhost:8081/queryUser,不需要重启服务,查看打印

在这里插入图片描述

  • 这里实现了动态刷新配置
  • 这里得出结论,当data id只存在micro-order时,会获取micro-order配置下的值,如果data id既有micro-order又有micro-order.properties时,会优先获取micro-order.properties下的值

3、fisher-dev.properties

  • 使用fisher作为data id的前缀,dev作为-dev,.properties必须要带上
spring.cloud.nacos.config.prefix=fisher
#需要配合spring.cloud.nacos.config.prefix使用,单独使用无效
spring.profiles.active=dev

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 重启服务,请求http://localhost:8081/queryUser,查看打印

在这里插入图片描述

yaml

1、micro-order

  • 配置文件使用bootstrap.yml

在这里插入图片描述

  • 把之前的data id为micro-order的配置改为yaml格式,这里server-name: micro-order使用冒号,不能用等号

在这里插入图片描述
在这里插入图片描述

  • 重启服务,请求http://localhost:8081/queryUser,查看打印

在这里插入图片描述
2、micro-order.yaml

  • 添加data id为micro-order.yaml的配置

在这里插入图片描述
在这里插入图片描述

  • 再次请求http://localhost:8081/queryUser,不需要重启服务,查看打印

在这里插入图片描述

  • 和properties格式的配置一样,这里也实现了动态刷新配置
  • 同样的结论,当data id只存在micro-order时,会获取micro-order配置下的值,如果data id既有micro-order又有micro-order.yaml时,会优先获取micro-order.yaml下的值
    3、myPrefix.yaml
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  相关解决方案