Spring Cloud Alibaba

Spring Cloud Alibaba简介

Spring Cloud Alibaba的官网:https://spring-cloud-alibaba-group.github.io/github-pages/2021/zh-cn/

Spring Cloud Alibaba致力于提供为微服务开发的一站式解决方案。Spring Cloud Alibaba包含开发分布式应用服务的必需组件,方便开发者通过Spring Cloud编程模型轻松使用这些组件来开发分布式应用服务。

基于Spring Cloud Alibaba,我们只需要添加一些注解和少量配置,就可以将Spring Cloud应用接入阿里分布式应用解决方案,通过阿里中间件来迅速搭建分布式应用系统。

Spring Cloud Alibaba功能

  • 服务限流降级:支持 WebServlet、WebFlux、OpenFeign、RestTemplate、Dubbo 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
  • 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
  • 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
  • Rpc服务:扩展 Spring Cloud 客户端 RestTemplate 和 OpenFeign,支持调用 Dubbo RPC 服务
  • 消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
  • 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。
  • 阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
  • 分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
  • 阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

Spring Cloud Alibaba Nacos

Nacos简介

Nacos(Naming Configuration Service)是一款阿里巴巴开源的核心组件之一,可以作为注册中心和配置中心使用,是一个易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Spring Cloud Alibaba Nacos Discovery

使用 Spring Cloud Alibaba Nacos Discovery,可基于 Spring Cloud 的编程模型快速接入 Nacos 服务注册功能。

本章即之后的章节项目将从微服务实战项目开始实现

服务注册/发现:Nacos Discovery

传统手动的法师来给每一个客户端来配置所有服务提者的服务列表是一件非常困难的事,而且不利于服务的动态扩缩容。

Nacos Discovery帮助您将服务自动注册到Nacos服务端并且能够动态感知和刷新某个服务实例的服务列表。除此之外,Nacos Discovery 也将服务实例自身的一些元数据信息-例如 host,port, 健康检查URL,主页等内容注册到 Nacos

安装并运行Nacos

下载安装包

下载地址:https://github.com/alibaba/nacos/releases

这里演示的是Release 1.4.3: https://github.com/alibaba/nacos/releases/tag/1.4.3

image-20220608151022859

解压安装包

image-20220608151336675

运行
方法一:直接运行bin目录下的startup.cmd

image-20220608151621137

方法二:命令行方式启动

image-20220608152119250

1
startup.cmd -m standalone
登录

账号:nacos 密码:nacos

image-20220608225920696

image-20220608225804004

IDEA运行Nacos
导入nacos文件夹

image-20220608231129349

终端方式启动

image-20220608231419442

编辑配置

image-20220608232132712

image-20220608233248311

通过配置启动

image-20220608232058033

image-20220608233607707

服务注册

父项目添加配置

image-20220611020306806

1
2
3
4
5
6
7
8
9
10
11
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.1.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
子项目添加配置

image-20220611020723174

1
2
3
4
5
6
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
修改配置文件

image-20220611021231105

1
2
3
4
5
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848 # 配置Nacos地址

其他微服务同样配置

启动项目

image-20220611021949207

image-20220611021927620

服务发现

基于OpenFeign实现服务发现调用以及负载均衡

导入依赖

image-20220611022550859

1
2
3
4
5
6
7
8
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
添加服务绑定接口和服务降级实现类

image-20220611024104034

启动服务测试

image-20220611130833755

image-20220612001230381

负载均衡

编辑配置

服务启动

image-20220612003248596

集群分区

拷贝配置文件

image-20220612124042870

编辑配置

image-20220612124226242

运行服务

image-20220612124304898

配置文件

image-20220612124621418

image-20220612124751157

可以看到远程调用会优先调用同区域的服务

配置中心

新建配置

image-20220612130208791

image-20220612130406018

模块导入依赖

image-20220612130732290

1
2
3
4
5
6
7
8
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
添加bootstrap.yml文件

1
2
3
4
5
6
7
8
9
10
spring:
application:
name: user-service
profiles:
active: dev #环境
cloud:
nacos:
config:
file-extension: yaml # 配置文件后缀名
server-addr: localhost:8848 # 配置中心服务器地址
动态配置刷新

image-20220612131405795

添加测试接口

@RefreshScope开启配置热更新

image-20220612131815556

接口测试

image-20220612132921114

命名空间

创建命名空间

image-20220612160137591

image-20220612160204606

image-20220612160223591

修改配置文件

image-20220612160411772

image-20220612160925156

搭建集群

集群部署架构图

image-20220622134121856

Docker拉取Nacos镜像
1
docker pull nacos/nacos-server

image-20220725133226976

导入镜像数据库

新建数据库

image-20220725154919101

运行SQL文件

image-20220725154956057

image-20220725155021863

创建用户

image-20220725155140678

配置角色权限

image-20220725155241752

创建自定义网络

Docker集群部署Nacos时要注意,创建的Nacos容器填写的ip都是外部ip,但是创建的网段却是docker内部的网段,因此 我们需要只能在同一网段的ip

1
2
3
docker network ls
docker network create --driver bridge --subnet=172.19.0.0/16 --gateway=172.19.0.1 mynetwork
docker network inspect mynetwork

image-20220725222721807

image-20220726134000193

创建Nacos容器集群

my-nacos1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
docker run -d \
-e PREFER_HOST_MODE=ip \
-e MODE=cluster \
-e NACOS_SERVER_IP=172.19.0.2 \
-e NACOS_APPLICATION_PORT=8848 \
-e NACOS_SERVERS="172.19.0.2:8848 172.19.0.3:8848" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=服务器公网ip \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=13851176590++ \
-e MYSQL_SERVICE_DB_NAME=nacos \
-p 8848:8848 \
--network=mynetwork \
--name my-nacos1 \
--ip 172.19.0.2 \
nacos/nacos-server

my-nacos2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
docker run -d \
-e PREFER_HOST_MODE=ip \
-e MODE=cluster \
-e NACOS_SERVER_IP=172.19.0.3 \
-e NACOS_APPLICATION_PORT=8848 \
-e NACOS_SERVERS="172.19.0.2:8848 172.19.0.3:8848" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=服务器公网ip \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=13851176590++ \
-e MYSQL_SERVICE_DB_NAME=nacos \
-p 8849:8848 \
--network=mynetwork \
--name my-nacos2 \
--ip 172.19.0.3 \
nacos/nacos-server

image-20220731222759572

访问my-nacos1地址:http://{ip}:8848/nacos/index.html

访问my-nacos2地址:http://{ip}:8849/nacos/index.html

输入默认的账户密码nacos登录成功则说明集群部署成功

image-20220725162901216

image-20220725162936386

使用Nginx反向代理Nacos集群

拉取nginx镜像并创建nginx容器

1
docker pull nginx
1
docker run --name nginx -p 8080:80 -d nginx

image-20220627213342836

将容器中的nginx配置文件拷贝到宿主机/usr/local/nginx/conf目录下

1
2
mkdir -p /usr/local/nginx/conf/nginx.conf
docker cp 53cf4d545507:/etc/nginx/nginx.conf /usr/local/nginx/conf/nginx.conf

停止并删除之前的nginx容器

1
2
docker stop 
docker rm

image-20220725164656491

修改nginx.conf配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
#tcp_nopush on;

keepalive_timeout 65;

#gzip on;

include /etc/nginx/conf.d/*.conf;

include /etc/nginx/conf.d/*.conf;

upstream cluster{
server 172.19.0.2:8848;
server 172.19.0.3:8848;
}

server {
listen 8080;
server_name _;

location / {
proxy_pass http://cluster;
}
}
}

数据挂载运行docker容器

1
docker run --name nginx --network=mynetwork -v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro -p 8080:8080 -d nginx

image-20220731225828171

访问:http://{ip}:8080/nacos/

image-20220731225909334

修改配置文件

1
2
3
4
cloud:
nacos:
discovery:
server-addr: {ip}:8080

运行服务

image-20220731230040255

image-20220731230103903