20200523 尚硅谷2020最新版SpringCloud【笔记】4
17.SpringCloud Alibaba入门简介
why会出现SpringCloud alibaba
Spring Cloud Netflix项目进入 维护模式
https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now
The following Spring Cloud Netflix modules and corresponding starters will be placed into maintenance mode:
1. spring-cloud-netflix-archaius
2. spring-cloud-netflix-hystrix-contract
3. spring-cloud-netflix-hystrix-dashboard
4. spring-cloud-netflix-hystrix-stream
5. spring-cloud-netflix-hystrix
6. spring-cloud-netflix-ribbon
7. spring-cloud-netflix-turbine-stream
8. spring-cloud-netflix-turbine
9. spring-cloud-netflix-zuul
Current | Replacement |
---|---|
Hystrix | Resilience4j |
Hystrix Dashboard / Turbine | Micrometer + Monitoring System |
Ribbon | Spring Cloud Loadbalancer |
Zuul 1 | Spring Cloud Gateway |
Archaius 1 | Spring Boot external config + Spring Cloud Config |
SpringCloud alibaba带来了什么?
是什么
https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
能干嘛
服务限流降級:默认支持 Servlet、Feign、Resttemplate、Dubo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降級 Metrics 监控。
服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访可任意类型的数据。
分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
SpringCloud alibaba学习资料获取
18.SpringCloud Alibaba Nacos服务注册和配置中心
Nacos简介
为什么叫Nacos
Naco 分别为 Naming 和 Configuration 的前两个字母,最后的 s 为 Service
是什么
一个更易于构建云原生应用的动态服务发现,配置管理和服务管理中心
Nacos:Dynamic Naming and Configuration Service
Nacos就是注册中心+配置中心的组合
Nacos = Eureka+Config+Bus
能干嘛
替代Eureka做服务注册中心
替代Config做服务配置中心
去哪下
各种注册中心比较
服务注册与发现框架 | CAP模型 | 控制台管理 | 社区活跃度 |
---|---|---|---|
Eureka | AP | 支持 | 低(2.x版本闭源) |
Zookeeper | CP | 不支持 | 中 |
Consul | CP | 支持 | 高 |
Nacos | AP | 支持 | 高 |
据说 Nacos 在阿里巴巴内部有超过10万的实例运行,已经过了类似双十ー等各种大型流量的考验
安装并运行Nacos
-
本地Java8+Maven环境已经OK
-
先从官网下载Nacos
-
解压安装包,直接运行bin目录下的startup.cmd
-
命令运行成功后直接访问 http://localhost:8848/nacos
默认账号密码都是nacos
Nacos作为服务注册中心演示
基于Nacos的服务提供者
-
Module,cloudalibaba-provider-payment9001
-
POM
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
-
YML
spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: localhost:8848 #配置Nacos地址
-
主启动类,添加注解
@EnableDiscoveryClient
-
业务类
@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; } }
-
测试
- 访问服务接口 http://localhost:9001/payment/nacos/1
- 查看 Nacos 控制台,服务列表
-
为了演示负载均衡,复制 cloudalibaba-provider-payment9001 为 cloudalibaba-provider-payment9002
IDEA 拷贝配置作为集群
Services 窗口里,右键微服务,Copy Configuration,配置 VM Options,-Dserver.port=9011
,启动 Copy 的微服务,测试 Copy 的微服务
基于Nacos的服务消费者
-
Module,cloudalibaba-consumer-nacos-order83
-
POM,同上
-
YML
spring: application: name: nacos-order-consumer cloud: nacos: discovery: server-addr: localhost:8848 #消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者) service-url: nacos-user-service: http://nacos-payment-provider
-
主启动类,添加注解
@EnableDiscoveryClient
-
业务类
public class OrderNacosController { @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 restTemplate.getForObject(serverURL + "/payment/nacos/" + id, String.class); } }
-
测试
-
查看 Nacos 控制台,服务列表
-
访问服务接口 http://localhost:83/consumer/payment/nacos/13
83访问9001/9002,轮询负载OK
-
服务注册中心对比
Nacos 生态图
Nacos和CAP
Nacos 支持 AP 和 CP 模式的切换
C是所有节点在同一时间看到的数据是一致的;而A的定义是所有的请求都会收到响应。
何时选择使用何种模式?
一般来说,如果不需要存储服务级別的信息且服务实例是通过 nacos- client 注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如 Spring cloud 和 Dubbo 服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。
如果需要在服务级别编辑或者存储配置信息,那么CP是必须,K8S服务和DNS服务则适用于CP模式。CP模式下则支持注册持久化实例,此时则是以 Raft 协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
Nacos作为服务配置中心演示
Nacos作为配置中心-基础配置
-
Module,cloudalibaba-config-nacos-client3377
-
POM
<!--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>
-
YML
-
bootstrap.yml
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 # 表示开发环境
-
-
主启动类,添加注解
@EnableDiscoveryClient
-
业务类,添加注解
@RefreshScope
,支持自动刷新@RestController @RefreshScope //支持Nacos的动态刷新功能。 public class ConfigClientController { @Value("${config.info}") private String configInfo; @GetMapping("/config/info") public String getConfigInfo() { return configInfo; } }
-
在 Nacos 中添加配置,nacos-config-client-dev.yaml,内容为
config: info: nacos config center,version = 2 from nacos config center, nacos-config-client-dev.yaml, version=3
-
测试
- 访问 http://localhost:3377/config/info
- 修改配置后,重新调用,测试自动刷新
Nacos作为配置中心-分类配置
Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。
Namespace + Group + Data ID
DataID 方案
指定 spring.profile.active
和配置文件的 DataID 来使不同环境下读取不同的配置
## Nacos 配置文件名称规则
${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
Group 方案
bootstrap.yml
中指定 spring.cloud.nacos.config.group
,对应 Nacos 中的 Group
。
Namespace 方案
bootstrap.yml
中指定 spring.cloud.nacos.config.namespace
,对应 Nacos 中的 Namespace
的 ID。
Nacos集群和持久化配置(重要)
Nacos持久化配置解释
Nacos 默认自带的是嵌入式数据库 derby
支持 Mysql
derby到mysql切换配置步骤
-
安装数据库,版本要求:
5.6.5+
-
初始化mysql数据库,数据库初始化文件:
nacos-mysql.sql
-
修改
conf/application.properties
文件,增加支持 mysql 数据源配置(目前只支持 mysql),添加 mysql 数据源的 url、用户名和密码spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=nacos_devtest db.password=youdontknow
Docker 版Nacos+MySQL生产环境配置
预计需要,1个nginx + 3个nacos注册中心 + 1个mysql
视频中使用的方法是安装到 Linux 上,我使用 Docker
Docker Hub
## 拉取镜像
docker pull nginx
docker pull nacos/nacos-server
## 运行容器
### MySQL 5.7
docker run --name mysql5 -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:5.7
### Nginx
docker volume create nginx
docker run --name nginx -d -p 8888:80 -v nginx:/etc/nginx nginx
安装 Nacos 集群
-
安装 git
yum -y install git git --version
-
安装 docker-compose
curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
速度太慢,使用迅雷下载
https://github.com/docker/compose/releases/download/1.24.1/docker-compose-Linux-x86_64
为命令赋权
chmod +x /usr/local/bin/docker-compose docker-compose --version
-
从 git 上下载 nacos-docker 项目,本地目录为 /opt/nacos-docker
git clone https://github.com/nacos-group/nacos-docker.git /opt/nacos-docker
-
修改内存大小,在
env/nacos-hostname.env
中加入内存配置因为虚拟机内存不够,所以需要修改内存配置
JVM_XMS=256M JVM_XMX=256M JVM_XMN=256M
-
安装 Nacos 集群
docker-compose -f example/cluster-hostname.yaml up
这种安装方式,自动安装成集群,数据存储在 Docker 中的 MySQL 内,详细信息参考
example/cluster-hostname.yaml
和env/nacos-hostname.env
集群访问路径为
http://192.168.181.128:8848/nacos http://192.168.181.128:8849/nacos http://192.168.181.128:8850/nacos
-
停止、启动 Nacos 集群
## 停止 docker-compose -f ./example/cluster-hostname.yaml stop ## 启动 docker-compose -f ./example/cluster-hostname.yaml start
配置 Nginx
修改 /var/lib/docker/volumes/nginx/_data/nginx.conf
,在其中添加 $upstream_addr
,日志输出中会带上被代理的地址
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
' -- $upstream_addr';
修改 /var/lib/docker/volumes/nginx/_data/conf.d/default.conf
upstream cluster {
# IP 哈希,默认为轮询
ip_hash;
server 192.168.181.128:8848;
server 192.168.181.128:8849;
server 192.168.181.128:8850;
}
server {
listen 80;
server_name localhost;
location / {
# root /usr/share/nginx/html;
# index index.html index.htm;
proxy_pass http://cluster;
}
}
暴露的访问路径为
http://192.168.181.128:8888/nacos
测试 Nacos 集群
-
访问并登录
http://192.168.181.128:8888/nacos
,查看 Nginx 日志docker logs -f nginx
-
查看 Nacos 中的【节点列表】,此时应该有一主二从,共三个节点
-
测试高可用
-
微服务 cloudalibaba-provider-payment9002、cloudalibaba-consumer-nacos-order83 启动注册进nacos集群
spring.cloud.nacos.discovery.server-addr: 192.168.181.128:8888
-
启动微服务并查看 Nacos 中的【服务列表】,存在两个服务
-
访问消费者服务,
http://localhost:83/consumer/payment/nacos/13
,返回正常 -
测试启动、停止 Nacos 容器,不影响服务使用
-