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学习资料获取

Spring 官网

GitHub 地址

Spring 官网文档

GitHub 中文

18.SpringCloud Alibaba Nacos服务注册和配置中心

Nacos简介

为什么叫Nacos

Naco 分别为 Naming 和 Configuration 的前两个字母,最后的 s 为 Service

是什么

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

Nacos:Dynamic Naming and Configuration Service

Nacos就是注册中心+配置中心的组合

Nacos = Eureka+Config+Bus

能干嘛

替代Eureka做服务注册中心

替代Config做服务配置中心

去哪下

GitHub

Nacos 官网文档

Spring 官方文档

各种注册中心比较

服务注册与发现框架 CAP模型 控制台管理 社区活跃度
Eureka AP 支持 低(2.x版本闭源)
Zookeeper CP 不支持
Consul CP 支持
Nacos AP 支持

据说 Nacos 在阿里巴巴内部有超过10万的实例运行,已经过了类似双十ー等各种大型流量的考验

安装并运行Nacos

  1. 本地Java8+Maven环境已经OK

  2. 先从官网下载Nacos

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

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

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

    默认账号密码都是nacos

Nacos作为服务注册中心演示

基于Nacos的服务提供者

  1. Module,cloudalibaba-provider-payment9001

  2. POM

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    
  3. YML

    spring:
      application:
        name: nacos-payment-provider
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848 #配置Nacos地址
    
  4. 主启动类,添加注解 @EnableDiscoveryClient

  5. 业务类

    @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 + "	 id" + id;
        }
    }
    
  6. 测试

    1. 访问服务接口 http://localhost:9001/payment/nacos/1
    2. 查看 Nacos 控制台,服务列表
  7. 为了演示负载均衡,复制 cloudalibaba-provider-payment9001 为 cloudalibaba-provider-payment9002

IDEA 拷贝配置作为集群

Services 窗口里,右键微服务,Copy Configuration,配置 VM Options,-Dserver.port=9011,启动 Copy 的微服务,测试 Copy 的微服务

基于Nacos的服务消费者

  1. Module,cloudalibaba-consumer-nacos-order83

  2. POM,同上

  3. YML

    spring:
      application:
        name: nacos-order-consumer
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848
    
    
    #消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
    service-url:
      nacos-user-service: http://nacos-payment-provider
    
  4. 主启动类,添加注解 @EnableDiscoveryClient

  5. 业务类

    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);
        }
    
    }
    
  6. 测试

    1. 查看 Nacos 控制台,服务列表

    2. 访问服务接口 http://localhost:83/consumer/payment/nacos/13

      83访问9001/9002,轮询负载OK

服务注册中心对比

Nacos 生态图

nacos_landscape.png

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作为配置中心-基础配置

  1. Module,cloudalibaba-config-nacos-client3377

  2. 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>
    
  3. YML

    1. 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格式的配置
      
    2. application.yml

      spring:
        profiles:
          active: dev # 表示开发环境
      
  4. 主启动类,添加注解 @EnableDiscoveryClient

  5. 业务类,添加注解 @RefreshScope,支持自动刷新

    @RestController
    @RefreshScope //支持Nacos的动态刷新功能。
    public class ConfigClientController {
        @Value("${config.info}")
        private String configInfo;
    
        @GetMapping("/config/info")
        public String getConfigInfo() {
            return configInfo;
        }
    }
    
  6. 在 Nacos 中添加配置,nacos-config-client-dev.yaml,内容为

    config:
        info: nacos config center,version = 2 from nacos config center, nacos-config-client-dev.yaml, version=3
    
  7. 测试

    1. 访问 http://localhost:3377/config/info
    2. 修改配置后,重新调用,测试自动刷新

Nacos作为配置中心-分类配置

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

Namespace + Group + Data ID

nacos_data_model

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切换配置步骤
  1. 安装数据库,版本要求:5.6.5+

  2. 初始化mysql数据库,数据库初始化文件:nacos-mysql.sql

  3. 修改 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

Nginx

Nacos nacos-docker GitHub

## 拉取镜像
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 集群

Nacos Docker集群部署

  1. 安装 git

    yum -y install git
    
    git --version
    
  2. 安装 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
    
  3. 从 git 上下载 nacos-docker 项目,本地目录为 /opt/nacos-docker

    git clone https://github.com/nacos-group/nacos-docker.git /opt/nacos-docker
    
  4. 修改内存大小,在 env/nacos-hostname.env 中加入内存配置

    因为虚拟机内存不够,所以需要修改内存配置

    JVM_XMS=256M
    JVM_XMX=256M
    JVM_XMN=256M
    
  5. 安装 Nacos 集群

    docker-compose -f example/cluster-hostname.yaml up
    

    这种安装方式,自动安装成集群,数据存储在 Docker 中的 MySQL 内,详细信息参考 example/cluster-hostname.yamlenv/nacos-hostname.env

    集群访问路径为

    http://192.168.181.128:8848/nacos
    http://192.168.181.128:8849/nacos
    http://192.168.181.128:8850/nacos
    
  6. 停止、启动 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 集群
  1. 访问并登录 http://192.168.181.128:8888/nacos,查看 Nginx 日志

    docker logs -f nginx
    
  2. 查看 Nacos 中的【节点列表】,此时应该有一主二从,共三个节点

  3. 测试高可用

    1. 微服务 cloudalibaba-provider-payment9002、cloudalibaba-consumer-nacos-order83 启动注册进nacos集群

      spring.cloud.nacos.discovery.server-addr: 192.168.181.128:8888
      
    2. 启动微服务并查看 Nacos 中的【服务列表】,存在两个服务

    3. 访问消费者服务,http://localhost:83/consumer/payment/nacos/13,返回正常

    4. 测试启动、停止 Nacos 容器,不影响服务使用

原文地址:https://www.cnblogs.com/huangwenjie/p/12942401.html