SpringCloud Alibaba01-Nacos单机与集群

全家桶介绍: https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_start_a_provider_application

整个父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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.huangzhen.springcloud</groupId>
    <artifactId>springcloud2020</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>cloudalibaba-provider-payment9001</module>
        <module>cloudalibaba-provider-payment9002</module>
        <module>cloudalibaba-consumer-order83</module>
        <module>cloudalibaba-config-nacos-client3377</module>
        <module>cloudalibaba-sentinel-service8401</module>
        <module>cloudalibaba-provider-payment9003</module>
        <module>cloudalibaba-provider-payment9004</module>
        <module>cloudalibaba-consumer-nacos-order84</module>
        <module>seata-order-service2001</module>
        <module>seata-account-service2003</module>
        <module>seata-storage-service2002</module>
    </modules>
    <packaging>pom</packaging>

    <!-- 统一管理jar包版本 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit.version>4.12</junit.version>
        <log4j.version>1.2.17</log4j.version>
        <lombok.version>1.16.18</lombok.version>
        <mysql.version>8.0.19</mysql.version>
        <druid.version>1.1.16</druid.version>
        <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
    </properties>

    <!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version  -->
    <dependencyManagement>
        <dependencies>
            <!--spring boot 2.2.2-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud Hoxton.SR1-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud alibaba 2.1.0.RELEASE-->
            <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>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${druid.version}</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.spring.boot.version}</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
                <optional>true</optional>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                    <addResources>true</addResources>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

1.Nacos:服务注册与配置中心

Nacos:Dynamic Naming and Configuration Service

Nacos = Eureka + Bus + Config

即Nacos是注册中心+配置中心。

官网: https://nacos.io/zh-cn

1.1 逻辑架构及其组件介绍

nacos-logic.jpg

  • 服务管理:实现服务CRUD,域名CRUD,服务健康状态检查,服务权重管理等功能
  • 配置管理:实现配置管CRUD,版本管理,灰度管理,监听管理,推送轨迹,聚合数据等功能
  • 元数据管理:提供元数据CURD 和打标能力
  • 插件机制:实现三个模块可分可合能力,实现扩展点SPI机制
  • 事件机制:实现异步化事件通知,sdk数据变化异步通知等逻辑
  • 日志模块:管理日志分类,日志级别,日志可移植性(尤其避免冲突),日志格式,异常码+帮助文档
  • 回调机制:sdk通知数据,通过统一的模式回调用户处理。接口和数据结构需要具备可扩展性
  • 寻址模式:解决ip,域名,nameserver、广播等多种寻址模式,需要可扩展
  • 推送通道:解决server与存储、server间、server与sdk间推送性能问题
  • 容量管理:管理每个租户,分组下的容量,防止存储被写爆,影响服务可用性
  • 流量管理:按照租户,分组等多个维度对请求频率,长链接个数,报文大小,请求流控进行控制
  • 缓存机制:容灾目录,本地缓存,server缓存机制。容灾目录使用需要工具
  • 启动模式:按照单机模式,配置模式,服务模式,dns模式,或者all模式,启动不同的程序+UI
  • 一致性协议:解决不同数据,不同一致性要求情况下,不同一致性机制
  • 存储模块:解决数据持久化、非持久化存储,解决数据分片问题
  • Nameserver:解决namespace到clusterid的路由问题,解决用户环境与nacos物理环境映射问题
  • CMDB:解决元数据存储,与三方cmdb系统对接问题,解决应用,人,资源关系
  • Metrics:暴露标准metrics数据,方便与三方监控系统打通
  • Trace:暴露标准trace,方便与SLA系统打通,日志白平化,推送轨迹等能力,并且可以和计量计费系统打通
  • 接入管理:相当于阿里云开通服务,分配身份、容量、权限过程
  • 用户管理:解决用户管理,登录,sso等问题
  • 权限管理:解决身份识别,访问控制,角色管理等问题
  • 审计系统:扩展接口方便与不同公司审计系统打通
  • 通知系统:核心数据变更,或者操作,方便通过SMS系统打通,通知到对应人数据变更
  • OpenAPI:暴露标准Rest风格HTTP接口,简单易用,方便多语言集成
  • Console:易用控制台,做服务管理、配置管理等操作
  • SDK:多语言sdk
  • Agent:dns-f类似模式,或者与mesh等方案集成
  • CLI:命令行对产品进行轻量化管理,像git一样好用

1.2 数据模型

Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认DEFAULT_GROUP

1.3 安装与运行Nacos

1.3.1 下载

https://github.com/alibaba/nacos/releases/tag/1.1.4

1.3.2 运行

解压安装包,直接运行bin目录下的startup.cmd

命令运行成功后直接访问http://localhost:8848/nacos

默认账户和密码都是nacos

1.4 Nacos作为服务注册中心

1.4.1 服务提供者

1.新建模块:cloudalibaba-provider-payment9001

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>springcloud2020</artifactId>
        <groupId>com.huangzhen.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloudalibaba-provider-payment9001</artifactId>

    <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>
</project>

3.yaml

server:
  port: 9001

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

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

4.主启动类

@SpringBootApplication
@EnableDiscoveryClient //发现服务
public class ProviderMain9001 {
    public static void main(String[] args){
        SpringApplication.run(ProviderMain9001.class, args);
    }
}

5.测试Controller

@RestController
@Slf4j
public class PaymentController {
    
    @Value("${server.port}")
    private String port;
    
    @GetMapping("/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Integer id) {
        return "这里是服务提供者:  " + port + "      \t 编号:" + id + "\t很高兴为您服务!";
    }
}

6.为了负载均衡的演示,参照9001,新建9002.

1.4.2 服务消费者

1.新建模块:cloudalibaba-consumer-nacos-order83

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>springcloud2020</artifactId>
        <groupId>com.huangzhen.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloudalibaba-consumer-order83</artifactId>

    <dependencies>
        <!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
        <dependency>
            <groupId>com.huangzhen.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </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>
</project>

3.yaml

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.主启动类

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

5.config:配置负载均衡

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced //必须加
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

6.Controller

@RestController
public class OrderController {

    @Value("${service-url.nacos-user-service}")//从yaml中取
    private String serverURL;

    @Resource
    private RestTemplate restTemplate;


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

7.测试:

启动nacos,9001,9002,83

http://localhost:83/consumer/payment/nacos/31

1.5 服务注册中心对比

CAP: 一致性(Consistency)可用性(Availability)分区容错性(Partition tolerance)

CAP原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。

Nacos:支持AP和CP模式的切换。

1.6 Nacos作为服务配置中心

1.新建模块

cloudalibaba-config-nacos-client3377

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>springcloud2020</artifactId>
        <groupId>com.huangzhen.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloudalibaba-config-nacos-client3377</artifactId>


    <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>
</project>

3.yml

3.1 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格式的配置

3.2 application.yml

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

4.主启动类

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

5.Controller

@RestController
@RefreshScope //动态刷新配置文件
public class ClientController {

    @Value("${config.info}")
    private String config_info;


    @GetMapping("/config/info")
    public String getConfig_info() {
        return config_info;
    }
}

6.Nacos配置规则

nacos控制台中Data ID配置规则:

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

${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}

  • prefix默认为spring.application.name的值
  • spring.profile.active 即为当前环境对应的profile,可以通过配置项 spring.profile.active来配置
  • file-exetension为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension来配置

注意, boostrap.yml中配置的 文件名为yaml时,Nacos的配置文件名也必须为yaml

7.在Nacos中添加配置

这里是已经配置好的,安装此去新建即可。

8.测试

  • 启动前需要在nacos客户端-配置管理-配置管理栏目下有对应的yaml配置文件
  • 运行cloud-config-nacos-client3377的主启动类
  • http://localhost:3377/config/info

会看到nacos中的配置文件的信息会显示在页面上。

9.自带动态刷新

修改下Nacos中的yaml配置文件,再次调用查看配置的接口,就会发现配置已经刷新。

不需要向Config和Bus中还要分发和广播。

1.7 配置中心详解

按照Namespace + Group + DataID设计配置,以适应多环境多项目管理。

类似Java里面的package名和类名,最外层的namespace是可以用于区分部署环境的,Group和DataID逻辑上区分两个目标对象。

三者情况:

默认情况:

  • Namespace=public
  • Group=DEFAULT_GROUP
  • Cluster=DEFAULT

Namespace:主要用来实现环境之间的隔离。

Group:可以把不同的微服务划分到同一个分组里面。

Service:就是微服务,一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。

Instance:微服务的实例。

1.8 三种配置案例

1.8.1 DataID方案

指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置:

  • 默认空间+默认分组+新建dev和test两个DataID

  • 通过spring.profile.active属性就能进行多环境下配置文件的读取

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

1.8.2 Group方案

  • 在创建配置时候,新建Group

  • 在bootstrap.yml中新加Group

  •       config:
            server-addr: localhost:8848 #Nacos作为配置中心地址
            file-extension: yaml #指定yaml格式的配置
            group: H1_GROUP
    

1.8.3 Namespace方案

  • 新建dev的Namespace

  • 回服务列表查看

  • 新加三条配置

  • 在bootstrap.yml中添加namespace

  •   cloud:
        nacos:
          discovery:
            server-addr: localhost:8848 #Nacos服务注册中心地址
          config:
            server-addr: localhost:8848 #Nacos作为配置中心地址
            file-extension: yaml #指定yaml格式的配置
            group: TEST_GROUP
            namespace: a8ddac2c-68f8-4b3c-8c65-b31e0327ebbc  #此为命名空间ID
    

1.9 Nacos集群

1.9.1 Nacos持久化说明

1.Nacos默认自带的是嵌入式数据库derby

2.derby到mysql切换配置步骤想·

  • nacos-server-1.1.4\nacos\conf目录下找到sql脚本:nacos-mysql.sql,提前新建库nacos_config

  • nacos-server-1.1.4\nacos\conf目录下找到application.properties,新增如下

  • spring.datasource.platform=mysql
    db.num=1
    db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
    db.user=root
    db.password=123456
    #这就代表后续我们新建的各种配置列表都会存入你设定的mysql数据库中,而不是存入自带的derby
    
  • 再次启动nacos,会发现前面的配置都消失了。

1.9.2 集群配置

1个Nginx+3个Nacos+1个MySQL(实际应该是MySQL集群,至少为一主一从)

为了减少端口的开放步骤,我提前将防火墙关闭。

1.通过Yum安装Nginx

  • 在/etc/yum.repo.d目录下面创建一个nginx的yum源,然后就可以直接用yum install nginx安装

  • cd /etc/yum.repo.d #切换到yum安装源文件目录

  • vim nginx.repo #创建一个安装包源,把以下内容复制进去,保存退出

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
  • yum repolist #查看是否成功加载了此数据源

  • yum install nginx
    systemctl enable nginx  #设置nginx为开机启动
    systemctl start nginx  #启动nginx服务
    

2.配置MySQL5.7

安装MySQL5.7教程: https://blog.csdn.net/WYA1993/article/details/88890883

  • 新建库nacos_config,将sql脚本:nacos-mysql.sql执行。

3.安装和配置Nacos

  • 通过WinSCP将nacos-server-1.1.4.tar.gz复制到/Software/mynacos中

  • tar -zxvf nacos-server-1.1.4.tar.gz解压缩

  • 选定启动方式

  • 修改application.properties配置,与window下操作一样

  • 修改cluster.conf -------在nacos/config 目录下

    • cp cluster.conf.example cluster.conf

    • vim cluster.conf ,修改成如下:

    • 这个ip不写127.0.0.1 必须是Linux命令hostname -i能识别的IP

  • 修改startup.sh,使其能够接受不同的启动端-----在nacos/bin目录下

4.配置Nginx

  • 由于是通过Yum安装的Nginx,Nginx的配置文件位于/etc/nginx

  • vim nginx.conf

  •     upstream cluster{
            server 127.0.0.1:3333;
            server 127.0.0.1:4444;
            server 127.0.0.1:5555;
       }
    
       server{
            listen  1111;
            server_name     localhost;
    
            location  / {
                    proxy_pass http://cluster;
            }
       }
    
  • 重启Nginx:systemctl restart nginx

5.测试

  • 启动三个nacos

    • ./startup.sh -p 3333/4444/5555 这里是三条命令(简写,别直接复制执行)
  • 由于Nginx是开机自动启动,这里不再启动。

  • 访问192.168.11.114:1111/nacos 这里192.168.11.114是我自己的ip地址

  • 显示如下则成功

  • 上面配置是我添加的,再到数据库中查看是否存在。

  • 显示如下则成功

  • 图没截完整,先缩小后放大,可以看到我在nacos上配置的一条记录。

posted @ 2020-04-13 21:37  H2deNote  阅读(686)  评论(0编辑  收藏  举报