Springcloud_H版-alibaba学习笔记(二十)SpringCloud Alibaba Nacos服务注册和配置中心

1.Nacos简介

Nacos命名

为什么叫Nacos:前四个字母分别为naming和Configuration的前两个字母,最后的s为service

是什么

一个更易于构建云原生应用的动态服务发现,配置管理和服务管理平台。

Nacos:Dynamic Naming and Configuration Service

Nacos就是注册中心+配置中心的组合等价于=eureka+config+Bus

能干嘛

替代eureka做服务注册中心
替代COnfig做服务配置中心

去哪下

https://github.com/alibaba/nacos

2.安装运行

环境:本地java8+maven
先从官网下载Nacos
解压安装包,直接运行bin目录下的startup.cmd
命令运行成功后直接访问http://localhost:8848/nacos
结果页面

3.Nacos作为服务注册中心

1.基于Nacos的服务提供者

1.建module

cloudalibaba-provider-payment9001

2.pom
1.父pom
<!--  spring cloud alibaba 2.2.0.RELEASE    -->  
<dependency>  
    <groupId>com.alibaba.cloud</groupId>  
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>  
    <version>2.2.0.RELEASE</version>  
    <type>pom</type>  
    <scope>import</scope>  
</dependency>
2.本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>dt-SpringCloud-2020</artifactId>  
        <groupId>com.dt.springcloud</groupId>  
        <version>1.0.0-SNAPSHOT</version>  
    </parent>  
    <modelVersion>4.0.0</modelVersion>  
  
    <artifactId>cloudalibaba-provider-payment9001</artifactId>  
  
    <properties>  
        <maven.compiler.source>8</maven.compiler.source>  
        <maven.compiler.target>8</maven.compiler.target>  
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
    </properties>  
    <dependencies>  
        <!--集成SpringCloud alibaba nacos-->  
        <dependency>  
            <groupId>com.alibaba.cloud</groupId>  
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>  
        </dependency>  
        <!--引入自定义的cloud-api-common包,可以使用其中的实体-->  
        <dependency>  
            <groupId>com.dt.springcloud</groupId>  
            <artifactId>cloud-api-common</artifactId>  
            <version>1.0.0-SNAPSHOT</version>  
        </dependency>  
        <!--用于页面图形化展示-->  
        <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>  
        <!-- 省去Get/Set方法 -->  
        <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>  
</project>
3.yml
server:  
  port: 9001  
spring:  
  application:  
    name: nacos-payment-provider  
  cloud:  
    nacos:  
      discovery:  
        server-addr: localhost:8848
4.主启动
/**  
 * 主启动类  
 * @author dwb  
 */@EnableDiscoveryClient  
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})  
public class PaymentMain9001 {  
  
    public static void main(String[] args) {  
        SpringApplication.run(PaymentMain9001.class,args);  
    }  
}
5.业务类
package com.dt.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(value = "/payment/nacos/{id}")  
    public String getPayment(@PathVariable("id") Integer id) {  
        return "nacos registry ,serverPort:" + serverPort + "\t id :" + id;  
    }  
}
6.测试

启动nacos
启动9001
观察服务列表
在这里插入图片描述

2.基于Nacos的服务消费者

1.新建Module

cloudalibaba-consumer-nacos-order83

2.pom
<!--集成SpringCloud alibaba nacos-->  
<dependency>  
    <groupId>com.alibaba.cloud</groupId>  
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>  
</dependency>
3.yml
server:  
  port: 83  
spring:  
  application:  
    name: nacos-order-consumer  
  cloud:  
    nacos:  
      discovery:  
        server-addr: localhost:8848  
# 消费者将要取访问的微服务名称(成功注册进nacos的服务提供者)  
service-url:  
  nacos-user-service: http://nacos-payment-provider
4.主启动
package com.dt.springcloud.alibaba;  
  
import org.springframework.boot.SpringApplication;  
import org.springframework.boot.autoconfigure.SpringBootApplication;  
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;  
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;  
  
@EnableDiscoveryClient  
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})  
public class OrderNacosMain83 {  
    public static void main(String[] args) {  
        SpringApplication.run(OrderNacosMain83.class, args);  
    }  
  
}
5.业务类
package com.dt.springcloud.alibaba.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;  
import org.springframework.web.client.RestTemplate;  
  
import javax.annotation.Resource;  
  
@RestController  
public class OrderController {  
    @Resource  
    private RestTemplate restTemplate;  
  
    @Value("${service-url.nacos-user-service}")  
    private String serverURL;  
  
    @GetMapping(value = "/consumer/payment/nacos/{id}")  
    public String paymentInfo(@PathVariable("id") Long id) {  
        return this.restTemplate.getForObject(serverURL + "/payment/nacos/" + id, String.class);  
    }  
}
6.配置类
package com.dt.springcloud.alibaba.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;  
  
@Configuration  
public class ApplicationContextConfig {  
    @Bean  
    @LoadBalanced    public RestTemplate getRestTemplate() {  
        return new RestTemplate();  
    }  
}
7.测试

3.服务中心对比

Nacos全景图

在这里插入图片描述

Nacos和CAP


在这里插入图片描述

AP和CP的切换

A:可用性
C:一致性
P:分区容错性

Nacos默认AP。

切换CP:
在这里插入图片描述

4.Nacos作为服务配置中心

1.Nacos作为配置中心–基础配置

1.新建module

cloudalibaba-config-nacos-client3377

2.POM
<!--集成SpringCloud alibaba nacos 注册发现-->  
<dependency>  
    <groupId>com.alibaba.cloud</groupId>  
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>  
</dependency>  
<!--集成SpringCloud alibaba nacos 配置中心-->  
<dependency>  
    <groupId>com.alibaba.cloud</groupId>  
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>  
</dependency>
3.YML

application.yml

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

bootstrap.xml

#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格式的配置。
为啥要配置两个

Nacos同Springcloud-config一样, 在项目初始化时, 要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。
springboot中配置文件的加载是存在优先级的,bootstrap优先与application。

4.主启动
package com.dt.springcloud.alibaba;  
  
import org.springframework.boot.SpringApplication;  
import org.springframework.boot.autoconfigure.SpringBootApplication;  
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;  
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;  
  
@EnableDiscoveryClient  
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})  
public class NacosConfigClientMain3377 {  
    public static void main(String[] args) {  
        SpringApplication.run(NacosConfigClientMain3377.class,args);  
    }  
}
5.业务类
package com.dt.springcloud.alibaba.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  //实现配置自动更新  
public class ConfigClientController {  
    @Value("${config.info}")  
    private String configInfo;  
  
    @GetMapping("/config/info")  
    public String getConfigInfo() {  
        return configInfo;  
    }  
}
6.nacos中的配置

Data Id:nacos-config-client-dev.yaml
Group:DEFAULT_GROUP
内容:
config:
info: nacos config center ,nacos-config-client-dev.yaml ,version=1

7.Nacos中的匹配规则

之所以要配置spring.application.name, 是因为它是构成Nacos配置管理dataId字段的一部分。
在Nacos SpringCloud中,dataId的完整格式如下:

${prefix}-${spring.profile.active}.${file-extension}

prefix默认为 spring.application.name的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置。
spring.profile.active 即当前环境对应的profile,注意:当spring.profile.active为空时,对应的连接符 - 也将不存在,dataId的拼接格式变成:

${prefix}.${file-extension}

file-exetension为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension来配置,目前只支持properties和yaml类型。

8.测试

启动cloudalibaba-config-nacos-client3377
访问localhost:3377/config/info
可以看到输出:nacos config center ,nacos-config-client-dev.yaml ,version=2
在nacos中更新内容后,刷新会动态刷新。

2.Nacos作为配置中心–分类配置

1.NameSpace + Group + DataID 三者关系

类似于java中的包名和类名
最外层的namespace可以用于区别部署环境的,Group和DataID逻辑上区分两个对象目标。

1.默认情况

Namespace=public , Group = DEFAULT_GROUP ,默认Cluster是DEFAULT.
nacos-config-client-dev.yaml

2.三种方案配置
1.DataID方案

指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置
通过spring.profile.active属性就能进行多环境下的配置文件的读取。
application.yml

spring:  
  profiles:  
    active: dev #表示开发环境  
    #active: test #表示测试环境  
    #active: info
2.Group方案

通过Group实现环境区分
在nacos图形界面控制台上面新建配置文件DataID
bootstrap和application

spring:  
  application:  
    name: nacos-config-client  
  cloud:  
    nacos:  
      discovery:  
        server-addr: localhost:8848 #nacos服务注册中心地址  
      config:  
        server-addr: localhost:8848 #nacos服务配置中心地址  
        file-extension: yaml #指定yaml格式的配置。  
        group: DEV_GROUP  #指定配置组  
3.Namespace方案

新建dev/test的namespace
回到服务管理-服务列表查看
按照域名配置填写
bootstrap和application

spring:  
  application:  
    name: nacos-config-client  
  cloud:  
    nacos:  
      discovery:  
        server-addr: localhost:8848 #nacos服务注册中心地址  
      config:  
        server-addr: localhost:8848 #nacos服务配置中心地址  
        file-extension: yaml #指定yaml格式的配置。  
        group: DEV_GROUP  #指定配置组  
        namespace: e46b5f61-0ddd-42a7-be23-eaebe60d9254 #指定命名空间

5.Nacos集群和持久化配置

1.Nacos持久化配置

Nacos持久化配置解释

Nacos默认自带的嵌入式数据库derby,如果启动多个默认配置下的Naocs节点,数据存储存在一致性问题,为了解决这个问题,Naocs采用了集中式存储的方式来支持集群化部署,目前只支持MySQL存储。

derby到mysql的切换配置步骤

1.nacos-server-1.1.4\nacos\conf目录下找到sql脚本:nacos-mysql.sql 并执行。
2.修改nacos-server-1.1.4\nacos\conf目录下找到application.properties文件。
3.启动nacos,可以看到一个全新的空记录界面,以前是记录近derby

2.Nacos支持的三种部署模式

单机模式:用于测试和单机试用。
集群模式:用于生产环境,确保高可用。
多集群模式:用于多数据中心场景。

3.Linux版nacos+mysql生产环境配置

预计需要,1个Nginx+3nacos注册中心+1个mysql
在这里插入图片描述

在这里插入图片描述

集群配置步骤(重点)
Linux服务器上mysql数据库配置

在linux上初始化Nacos数据库脚本。
文件路径:

\nacos\conf\mysql-schema.sql
修改配置文件,指定数据库

修改application.properties文件。

#Kingbase

spring.datasource.platform=kingbase8

db.num=1

db.url.0=jdbc:kingbase8://192.168.xxx.xxx:54321/nacos_kingbase?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC

db.user.0=xxx

db.password.0=xxx
Linux服务器上nacos的集群配置cluster.conf

1.在一台机器复制出三分nacos,不同机器搭建集群可忽略。
在这里插入图片描述

2.梳理3台nacos机器的不同服务地址及端口号信息

192.168.128.25:48848
192.168.128.25:48858
192.168.128.25:48868

3.复制出cluster.conf备份。
文件路径

\nacos\conf\cluster.conf

4.修改application.properties,修改不同端口号。

### Default web server port:                                  
server.port=48848
### Default web server port:                                  
server.port=48858
### Default web server port:                                  
server.port=48868

4.分别修改三份cluster.com配置,内容修改;

#it is ip
192.168.28.25:48848
192.168.28.25:48858   
192.168.28.25:48868

注意:这个IP不能写127.0.0.1,必须是Linux命令hostname -i能够识别的IP

编辑nacos的启动脚本startup.sh,使它能够接受不同的启动端口

1.文件路径:

/mynacos/nacos/bin/startup.sh

2.修改内容,增加端口(说明:nacos2.2.0开始,配置中已经有该配置)
在这里插入图片描述

在这里插入图片描述

(说明:nacos2.2.0开始,配置中已经有该配置)
在这里插入图片描述

执行方式
在这里插入图片描述

Nginx的配置,由它作为负载均衡器

修改Nginx的配置文件nginx.conf,位置

/usr/local/nginx/conf

修改内容,将41111端口转发到48848、48858、48868端口下。
在这里插入图片描述

启动

cd /usr/local/nginx/sbin

指定配置文件启动

./nginx -c /usr/local/nginx/conf/nginx.conf
微服务cloudalibaba-provider-payment9002启动注册进nacos集群
1.修改YML文件。地址改成nginx的地址及端口
server:  
  port: 9002  
spring:  
  application:  
    name: nacos-payment-provider  
  cloud:  
    nacos:  
      discovery:  
        server-addr: 192.168.28.25:41111 # 换成nginx的41111端口,使用nacos集群。  
        #单机nacos地址:server-addr: localhost:8848
2.查看nacos界面

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值