【SpringCloud】 SpringCloud Alibaba Nacos服务注册和配置中心 (十一)

1. 概述与环境搭建

1.1 Nacos是什么

  • 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台
  • 替代Eureka做服务注册中心
  • 替代Config做服务配置中心
  • 集成了负载均衡Ribbon

1.2 官网

如果访问不到网址,可以用4G网络试试
GitHub:https://github.com/alibaba/Nacos
官网:https://nacos.io/zh-cn/index.html
API文档:https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibaba_nacos_discovery
下载地址:https://github.com/alibaba/nacos/releases

1.3 Windows安装Nacos

  1. 下载windows版本
    在这里插入图片描述
  2. 解压安装包
  3. 进入bin目录打开cmd界面
    在这里插入图片描述
  4. 在cmd界面输入startup.cmd -m standalone
    在这里插入图片描述
  5. 访问网址 http://localhost:8848/nacos ,帐号密码都是nacos
    在这里插入图片描述

1.4 docker安装Nacos

  • 下载nacos镜像
docker pull nacos/nacos-server
  • 运行nacos镜像
# MODE=standalone表示单机模式,非集群
docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server
  • 访问Nacos管理页面 http://ip地址:8848/nacos
    在这里插入图片描述

1.5 父工程pom引入SpringCloud Alibaba的依赖

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.1.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

2. Nacos注册中心

2.1 基于Nacos的服务提供者

  • 新建模块cloudalibaba-provider-payment9011
  • 根据9011模块复制一个9012模块
2.1.1 pom文件
<dependencies>
    <!--SpringCloud ailibaba nacos -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!-- SpringBoot整合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>
    <!--日常通用jar包配置-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
2.1.2 yml文件
server:
  port: 9011

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #配置中心Nacos的地址

# 暴露端点便于监控(非必须,监控时要用到)
management:
  endpoints:
    web:
      exposure:
        include: '*'
2.1.3 启动类

启动类添加@EnableDiscoveryClient注解

package com.springcloud;

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

@SpringBootApplication
@EnableDiscoveryClient  // 开启注册中心功能
public class NacosPaymentMain9011 {
    public static void main(String[] args) {
        SpringApplication.run(NacosPaymentMain9011.class,args);
    }
}

2.1.4 控制器
package com.springcloud.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PaymentController {
    @Value("${server.port}")
    private  String serverPort;

    @GetMapping("/payment/get/{id}")
    public  String get(@PathVariable("id") Integer id){
        return "端口:"+serverPort+",id:"+id;
    }
}

2.1.5测试
  1. 启动9011

  2. 启动9012

  3. 访问 http://localhost:9011/payment/get/2
    在这里插入图片描述

  4. 访问注册中心管理界面 http://localhost:8848/nacos
    在这里插入图片描述
    在这里插入图片描述

2.2 基于Nacos的服务消费者

  • 新建模块cloudalibaba-consumer-order6011
  • OpenFeign版本略
2.2.1 pom文件
<dependencies>
    <!--SpringCloud ailibaba nacos -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!-- SpringBoot整合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>
    <!--日常通用jar包配置-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
2.2.2 pom文件
server:
  port: 6011

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

#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
  nacos-user-service: http://nacos-payment-provider
2.2.3 启动类
package com.springcloud;

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 NacosOrderMain6011 {

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

    // RestTemplate实例
    @Bean
    @LoadBalanced // 负载均衡
    public RestTemplate restTemplate(){
        return  new RestTemplate();
    }
}

2.2.4 控制器
package com.springcloud.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
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;

@RestController
public class OrderController {
    @Autowired
    private RestTemplate restTemplate;

    @Value("${service-url.nacos-user-service}")
    private String serverURL;

    @GetMapping("/consumer/payment/get/{id}")
    public  String get(@PathVariable("id") Integer id){
        return restTemplate.getForObject(serverURL+"/payment/get/"+id,String.class);
    }
}

2.2.5 测试
  1. 依次启动9011、9012、6011
  2. 多次访问 http://localhost:6011/consumer/payment/get/2
    在这里插入图片描述
    在这里插入图片描述

3. Nacos配置中心

  • 配置中心不用手动代码搭建,直接在Nacos管理界面可查看
  • 配置中心自带动态刷新配置功能,Nacos管理界面修改配置文件立即生效,不用额外的cmd命令

3.1 基础配置

新建cloudalibaba-config-nacos-client3377模块

3.1.1 pom文件
<dependencies>
    <!--nacos-config-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    <!--nacos-discovery-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!--web + actuator-->
    <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>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
3.1.2 yml文件
  • bootstrap.yml
# nacos配置
server:
  port: 3377

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

  • application.yml
 spring:
  profiles:
    active: dev # 表示开发环境
3.1.3 启动类
package com.springcloud;

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

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigClientMain3377 {
    public static void main(String[] args) {
        SpringApplication.run(NacosConfigClientMain3377.class,args);
    }
}

3.1.4 控制器
package com.springcloud.controller;

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

@RestController
@RefreshScope //在控制器类加入@RefreshScope注解使当前类下的配置支持Nacos的动态刷新功能。
public class ConfigClientController {
    // 获取配置中心的配置文件中的属性
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo(){
        return configInfo;
    }
}

3.1.4 Data ID匹配规则

最终公式:${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
在这里插入图片描述

在这里插入图片描述

3.1.5 在Nacos配置中心界面新建配置

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

3.1.6 测试
  1. 启动3377
  2. 访问http://localhost:3377/config/info
    在这里插入图片描述
  3. 修改配置中心的配置文件内容
    在这里插入图片描述
  4. 再次访问http://localhost:3377/config/info
    在这里插入图片描述

3.2 分类配置

3.2.1 概述

在这里插入图片描述

  • Namespace默认public,Group默认DEFAULT_GROUP, Cluster默认DEFAULT

  • Namespace用于生产环境隔离,比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。

  • Group对不同的微服务进行分组

  • Service就是微服务;一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。比方说为了容灾,将Service微服务分别部署在了杭州机房和广州机房,这时就可以给杭州机房的Service微服务起一个集群名称(HZ),给广州机房的Service微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。

  • Instance,就是微服务的实例。

3.2.2 配置文件匹配规则

配置文件匹配规则:Namespace+Group+Data ID
Data ID匹配规则:服务名-生产环境.配置文件后缀名
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

3.2.3 新建命名空间

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

3.2.4 在命名空间下新建配置并指定分组

在这里插入图片描述

在这里插入图片描述

3.2.5 根据命名空间和分组查找配置文件

namespace:命名空间ID
group:分组名称

# nacos配置
server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 # Nacos作为配置中心地址
        file-extension: yaml        # 指定yaml格式的配置
        namespace: test             # 命名空间ID,主要是ID,不是名称
        group: 3377_GROUP           # 分组名称

  profiles:
    active: test  # 表示测试环境
#    active: dev # 表示开发环境
3.2.6 测试

在这里插入图片描述

4. Nacos集群

4.1 架构图

在这里插入图片描述

4.2 MySQL

4.2.1 MySQL安装

参考链接的4.1

4.2.2 执行Nacos建表语句
  1. 新建一个名字nacos-config的数据库
  2. 执行Nacos建表语句
  • 方式1:下载的安装包的conf目录下的nacos-mysql.sql
    在这里插入图片描述

  • 方式2:GitHub上的SQL

  1. 执行完效果
    在这里插入图片描述

4.3 Docker构建Nacos集群

分别运行以下3个镜像

docker run -d \
-p 8845:8848 \   #把docker容器内的8848端口映射到Linux的8845端口
--name c_nacos1 \  # 容器名称
-e MODE=cluster \  # 集群模式
-e NACOS_SERVERS="192.168.23.131:8845 192.168.23.131:8846 192.168.23.131:8847" \  # Nacos集群的主机,因为是单机3个docker容器,所以用端口区分
-e SPRING_DATASOURCE_PLATFORM=mysql \  # 使用mysql持久化保存Nacos数据
-e MYSQL_SERVICE_HOST=192.168.23.131 \ # mysql所在的主机IP
-e MYSQL_SERVICE_PORT=3306 \  # mysql端口号
-e MYSQL_SERVICE_DB_NAME=nacos_config \  # nacos数据库的数据库名
-e MYSQL_SERVICE_USER=root \ # mysql帐号
-e MYSQL_SERVICE_PASSWORD=root \  # mysql密码
nacos/nacos-server:2.0.2


docker run -d \
-p 8846:8848 \
--name c_nacos2 \
-e MODE=cluster \
-e NACOS_SERVERS="192.168.23.131:8845 192.168.23.131:8846 192.168.23.131:8847" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.23.131 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
nacos/nacos-server:2.0.2


docker run -d \
-p 8847:8848 \
--name c_nacos3 \
-e MODE=cluster \
-e NACOS_SERVERS="192.168.23.131:8845 192.168.23.131:8846 192.168.23.131:8847" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.23.131 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
nacos/nacos-server:2.0.2

在这里插入图片描述

4.4 Nginx

# 安装Nginx
docker pull nginx

# 运行镜像
docker run -d -p 1111:80 --name c_nginx nginx

# 进入容器
docker exec -it c_nginx /bin/bash

# 安装vim工具
apt-get update
apt-get -y install vim 

# 进入nginx目录
cd /etc/nginx
#备份nignx配置文件
cp nginx.conf nginx.conf.bk

# 修改配置文件
vim /etc/nginx/nginx.conf

在gzip on下面添加以下代码

# 负载均衡配置
upstream nacos{
    # 3个docker的nacos
	server 192.168.23.131:8845;
	server 192.168.23.131:8846;
	server 192.168.23.131:8847;
}

server{
	listen		80;  # 这里监听的是80端口,而不是1111,因为docker进行了映射
	server_name	192.168.23.131;  # 监听访问的地址主机
	
	location / {
		proxy_pass	http://nacos;  # 引用上面的负载均衡配置
	}
}

在这里插入图片描述

# 退出nginx容器
exit

# 重启nginx容器
docker restart c_nginx

访问http://192.168.23.131:1111/nacos/#/login
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值