全家桶介绍: 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 逻辑架构及其组件介绍

  • 服务管理:实现服务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上配置的一条记录。

最新文章

  1. Angular中使用Rainbow
  2. Hadoop学习笔记(一)从官网下载安装包
  3. 将php网站移到CentOS 6.7上[二]:将网站部署到服务器上
  4. 重写TiledServiceLayer实现Arcgis访问Mapabc地图服务 (转载)
  5. Android开发把项目打包成apk
  6. ubuntu12.04下txt文件乱码如何解决
  7. hishop网站迁移后出现DataProtectionConfigurationProvider错误(转)
  8. Codeforces Round #336 (Div. 2) D. Zuma
  9. [LeetCode] Search in Rotated Sorted Array [35]
  10. SEO市场是在扩大还是缩小 Seoer终于会变成什么?
  11. xcode6 中增加SDWebImage/SDWebImageDownloaderOperation.m报错解决方法
  12. imageX及其安装windows
  13. 201521123100 《Java程序设计》第13周学习总结
  14. springboot + @scheduled 多任务并发
  15. C# BarCodeToHTML条码生成类
  16. 线程GIL锁 线程队列 回调函数
  17. Spring学习记录
  18. gridview列超链接的几种设置方法
  19. Flutter自定义标题栏之处理状态栏高度
  20. 翻转数字最后n位

热门文章

  1. openstack的yum源出错,配置openstack-ocata版的在线yum源,openstack的yum源配置
  2. ReentrantReadWriteLock 源码分析以及 AQS 共享锁 (二)
  3. css 固比固模型
  4. Spring Cloud - Nacos注册中心入门单机模式及集群模式
  5. Spring框架——基于XML/注解开发
  6. Mol Cell Proteomics. | Proteomics Analysis of Extracellular Matrix Remodeling During Zebrafish Heart Regeneration (解读人:徐宁)
  7. requests模块使用二
  8. 小米官网轮播图js+css3+html实现
  9. ASP.NET Core 3.x 中间件流程与路由体系
  10. vue 指令,成员,组件