SpringCloud 第七期 Nacos 注册配置中心

本文介绍了如何搭建并使用Nacos作为服务注册中心和配置中心。从下载Nacos到切换高一致性模型,再到启动与访问控制台,详细展示了服务提供方和服务消费方的配置。通过示例代码展示了Spring Cloud整合Nacos的实现,包括服务的注册与发现、负载均衡以及使用Feign进行服务调用。同时,还演示了如何将Nacos作为配置中心,动态获取和刷新配置信息。
摘要由CSDN通过智能技术生成

nacos下载地址 Release 1.4.0 (Nov 2, 2020) · alibaba/nacos · GitHub

nacos默认是AP 高可用模型

可以通过下面命令切换为CP 高一致性模型

curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'

nacos启动,win版nacos解压出的文件夹下直接点击 startup.cmd

启动完毕后访问http://localhost:8848/nacos

可以看到如下界面

然后构造9001 9002 服务提供方 , 82 服务消费方

9001 9002 依赖如下

<?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>cloud2021</artifactId>
        <groupId>com.liuxu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-nacos-provider9001</artifactId>
    <dependencies>
    <dependency>
        <groupId>com.liuxu</groupId>
        <artifactId>cloud-commons</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <!--springboot 必须有的-->
    <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>
      <!--使用nacos-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    </dependencies>

</project>
<?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>cloud2021</artifactId>
        <groupId>com.liuxu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-nacos-provider9002</artifactId>
    <dependencies>
    <dependency>
        <groupId>com.liuxu</groupId>
        <artifactId>cloud-commons</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <!--springboot 必须有的-->
    <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>
      <!--使用nacos-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>

</project>

主启动类上添加注解

@EnableDiscoveryClient

package liuxu;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @author liuxu
 * @date 2021/11/13 16:49
 */
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderMain {

    public static void main(String[] args) {
        SpringApplication.run(NacosProviderMain.class, args);
    }
}

yml添加nacos注册中心配置,自行根据需要修改port 端口号

server:
  port: 9002

spring:
  application:
    name: nacos-payment-provider
  cloud:
   nacos:
    discovery:
      server-addr: localhost:8848
#Actuator 服务监控有关内容
management:
  endpoints:
    web:
      exposure:
        include: '*'

启动 9001 9002 可以看到 两个同名实例已经注册

再新建一个消费方83

依赖

<?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>cloud2021</artifactId>
        <groupId>com.liuxu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-nacos-consumer83</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.liuxu</groupId>
            <artifactId>cloud-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--springboot 必须有的-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--OpenFeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</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>
    </dependencies>

</project>

主启动

package com.liuxu;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * @author liuxu
 * @date 2020/11/4 16:49
 */
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class NacosConsumerMain {

    public static void main(String[] args) {
        SpringApplication.run(NacosConsumerMain.class, args);
    }
}
server:
  port: 83

spring:
  application:
    name: nacos-consumer
  cloud:
   nacos:
    discovery:
      server-addr: localhost:8848

management:
  endpoints:
    web:
      exposure:
        include: '*'

配置类,给RestTemplate 配置负载均衡

package com.liuxu.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @author liuxu
 * @date 2021/11/3 21:24
 */
@Configuration
public class ApplicationContext {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

controller 层可以通过 restTemlate 调用服务,也可以通过OpenFeign调用服务

Feign接口层

package com.liuxu.feign;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * @author liuxu
 * @date 2021/11/4 20:32
 */
@FeignClient("nacos-payment-provider")
public interface NacosProviders {
    @GetMapping(value = "/echo/{String}")
    public String echo(@PathVariable("String") String string);
}

controller启动83 注册中心 现在又一个消费方 83 俩个服务提供方 9001 9002 注册完成

http://localhost:83/consumer/feign/1

http://localhost:83/consumer/nacos/1

均可以调用服务提供方 OpenFeign和restTemlate同样适用

nacos同样是注册中心

下面做注册中心的演示

在 83 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">
    <parent>
        <artifactId>cloud2021</artifactId>
        <groupId>com.liuxu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-nacos-consumer83</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.liuxu</groupId>
            <artifactId>cloud-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--springboot 必须有的-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--OpenFeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</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>
        <!--nacos-config-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
    </dependencies>

</project>

yaml文件中 加入配置中心地址

server:
  port: 83

spring:
  application:
    name: nacos-consumer
  cloud:
   nacos:
    discovery:
      server-addr: localhost:8848
    config:
      server-addr: localhost:8848 #Nacos作为配置中心地址
      file-extension: yaml #指定yaml格式配置




management:
  endpoints:
    web:
      exposure:
        include: '*'

新建 bootstrap.yml 来指定 考入上述配置

原application.yml用来指定运行环境,内容为

spring:
  profiles:
    #active: info
    active: dev #表示开发环境
    #active: test

controller中添加读取配置文件的接口 并开启动态刷新

package com.liuxu.controller;

import com.liuxu.feign.NacosProviders;
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.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @author liuxu
 * @date 2021/11/3 21:23
 */
@RestController
@RefreshScope //支持动态刷新
public class NacosController {
    @Autowired
    RestTemplate restTemplate;
    private String serverURL = "http://nacos-payment-provider";

    @Autowired
    NacosProviders nacosProviders;
    @GetMapping("consumer/nacos/{id}")
    public String payInfo(@PathVariable String id){
        return restTemplate.getForObject(serverURL+"/echo/"+id,String.class);
    }

    @GetMapping("consumer/feign/{id}")
    public String getFeign(@PathVariable String id){
        return nacosProviders.echo(id);
    }


    @Value("${config.info}")
    private String configInfo;
    @Value("${config.data}")
    private String data;
    @GetMapping("/config/info")
    public String getConfigInfo(){
        return "configInfo:"+configInfo+"data:"+data;
    }
}

nacos中添加配置

group 选择 DEFAULT_GROUP 命名空间为public 这两个都是默认读取的位置

新建文件格式为yaml,文件名为nacos-consumer-dev.yaml 配置中心会根据这个匹配相应的配置文件,

配置完成 发布,访问http://localhost:83/config/info 可以读取到配置文件中地址

配置中心还会有Data Id Group 和 命名空间的区分

首先可以命名空间和Group配置的情况下 读取的是public 命名空间下 DEFAULT_GROUP

组下配置文件

如果新增命名空间 会有命名空间的id

新增Group会有Group名字

只需要在配置文件中指定相应的命名空间 id 和Group组即可

server:
  port: 83

spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式配置
        namespace: 0f45b872-07aa-4608-a01a-d9f9bee7940e # 命名空间id
        group: DEV_GROUP # 分组group

#配置文件命名UI自
#${spring.application.yaml.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}



management:
  endpoints:
    web:
      exposure:
        include: '*'

对应配置中心

寻找配置文件的过程为 对应命名空间id(或者默认的public空间)

对应group , 对应环境下的文件名

nacos作为注册中心和配置中心的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值