03 springcloudalibaba

入门

微服务框架

来自网络资源

分布式服务存在的问题:

  1. RPC远程调用超时问题
  2. 安全问题:加密访问、令牌传输数据、限流、服务保护等
  3. 服务治理
  4. 快速定位链路错误

注册中心

作用

  • 存放服务接口调用地址
  • 心跳机制,动态感知服务上下线

安装 NACOS

参考链接:https://github.com/nacos-group/nacos-docker/tree/master/example

  1. docker-compose.yml文件 启动命令 docker-compose up
    a. 初始化数据库
# 需要执行mysql.sql创建数据库。数据表、授权用户
#mysql.sql链接:https://github.com/alibaba/nacos/blob/master/config/src/main/resources/META-INF/nacos-db.sql
SELECT host, user from user;
create user 'nacos'@'%' identified by 'nacos';
CREATE DATABASE nacos_db;
grant all privileges on nacos_db.* to 'nacos'@'%' identified by 'nacos';
flush privileges;

b. docker-compose.yml

version: "3.2"
services:
  # nacos注册中心,配置中心
  nacos:
    image: nacos/nacos-server:latest
    restart: on-failure
    ports:
      - 8848:8848
    depends_on:
      - mysql
    environment:
      - MODE=standalone
      - JVM_XMS=256m
      - JVM_XMX=256m
      - JVM_XMN=128m
      - PREFER_HOST_MODE=hostname
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=mysql
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_USER=nacos
      - MYSQL_SERVICE_PASSWORD=nacos
      - MYSQL_SERVICE_DB_NAME=nacos_db
    volumes:
      - ./nacos/logs:/home/nacos/logs
      - ./nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties

  # mysql
  mysql:
    image: 'mysql:5.7'
    ports:
      - 3306:3306
    volumes:
      - /home/dockerdir/mysql/data:/var/lib/mysql
      - /home/dockerdir/mysql/conf:/etc/mysql/conf.d
    environment:
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=111111
      - MYSQL_DATABASE=nacos_db
      - MYSQL_USER=nacos
      - MYSQL_PASSWORD=nacos

docker-compose up 启动成功后,
测试成功:curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'

  1. 创建springboot项目
    a. pom版本
2.3.9.RELEASE
Hoxton.SR10
2.2.3.RELEASE

b. b.创建bootstrap.yml, 不能用application.yml否则配置中心报错

Applicaton.yml是由SpringApplicationContext加载的;
Bootstrap.yml是由应用上下文加载的,最优先加载,
而配置中心读取的是application.name,所以加载不到

c. 同一个命令空间,同一个分组的服务之间才能相互调用

server:
  port: 9090
spring:
  application:
    name: myproducerservice
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.207.128
        group: DEFAULT_GROUP
        namespace: 30be54d2-b423-4066-8db8-3a4ad014d649

配置中心

作用

  • 统一管理配置文件
  • 动态修改配置文件

简单使用

配置中心创建:
Data-Id格式:服务名-版本.yml  ${prefix}-${spring.profiles.active}.${file-extension}

服务配置:
config:
  server-addr: ${spring.cloud.nacos.discovery.server-addr}
  namespace: ${spring.cloud.nacos.discovery.namespace}
  group: ${spring.cloud.nacos.discovery.group}
  file-extension: yml

默认不动态刷新
@RefreshScope 实时刷新配置  如果刷新配置报错:更换nacos版本:2.2.3.RELEASE

多版本使用

部署时更换profiles
spring: 
  profiles:
    active: dev

fegin分布式服务调用

负载均衡算法

1.轮询
2.权重轮询
3.随机算法
4.hash一致性
5.固定ip

底层原理

@FeignClient(value = "myproducerservice"
AOP代理:获取注解服务名称,拉取注册中心的服务列表,本地负载均衡器,HtppClient发起请求,超时降级、并发削峰

本质上还是http请求,所以实现类 必须添加@RestController,否则找不到请求方法

服务保护 sentinel

作用

  • 动态控制限流规则
    通常采用服务保护的措施有:黑名单、限流熔断、服务隔离、服务降级
  1. 服务QPS限流
    限制每秒请求数量

  2. 服务线程数限流
    某个服务接口有自己的线程池,线程数为N,大于N时直接降级
    服务雪崩:tomcat共有N个线程,高并发时全部处理某个接口,导致其余接口不能响应
    解决:1、每个接口有自己的线程池;2、接口的阈值限制

  3. 热词限流

  4. 集群流量管控

  5. 服务降级

服务限流使用

参考链接:https://blog.csdn.net/jianzhang11/article/details/103490858

  1. 执行命令
docker run --name sentinel -p 8858:8858 -d  bladex/sentinel-dashboard:latest
  1. 降级服务配置
sentinel:
  transport:
    dashboard: 192.168.207.128:8858
# 虚拟机时连接不上,需要设置VMnet8
clientIp: 192.168.207.1
  eager: true
  1. 设置降级
@SentinelResource
  1. sentinel dashbord 设置规则
    虚拟机无法设置规则:https://blog.csdn.net/miachen520/article/details/113799600
    创建规则之后不起作用:
    a.流控的blockHandler自定义资源必须为public static 函数
    b.@SentinelResource注解的value与@RequestMapping的value一样
    c.资源名是否与@SentinelResource的value一样;
    d.参数、返回值是否一样,且最后加BlockException

限流规则持久化

参考链接:https://blog.didispace.com/spring-cloud-alibaba-sentinel-2-1/

  1. 通过Nacos配置文件,修改流控规则---拉取--->Sentinel Dashboard界面显示最新的流控规则。
dependency>
    com.alibaba.csp
    sentinel-datasource-nacos


# 持久化
sentinel:
datasource:
  ds:
    nacos:
      server-addr: ${spring.cloud.nacos.discovery.server-addr}
      groupId: ${spring.cloud.nacos.discovery.group}
      namespace: ${spring.cloud.nacos.discovery.namespace}
      dataId: ${spring.application.name}-sentinel
      data-type: json
      rule-type: flow
  1. Nacos配置,
    可以参考sentinel日志,创建一个规则就会打印一条日志
[
   {
       // 资源名称
       "resource": "helloSentinel",
       // 来源应用
       "limitApp": "default",
       // 阀值类型,0-线程数,1-qps
       "grade": 1,
       // 单机阀值
       "count": 1,
       // 流控模式,0-直接,1-关联,2-链路
       "strategy": 0,
       // 流控效果,0-快速失败,1-warm up,2-排队等待
       "controlBehavior": 0,
       // 是否集群
       "clusterMode": false
   }
]

网关限流使用

网关是有服务接口的统一入口,所以通常都是在网关处进行限流降级

网关 gateway

作用

  • 后端服务集群入口,路由转发
  • 过滤器,乱码等问题
  • 登录用户认证 token
  • 服务限流
  • 解决跨域问题
    拓展
    问题:一个服务集群有多个网关,nginx怎么感知网关的动态上下线?
    解决:动态感知:https://segmentfault.com/a/1190000021686433

单机使用


    org.springframework.cloud
    spring-cloud-starter-gateway


gateway:
  discovery:
    locator:
      # 开启以服务ID去注册中心上获取转发服务
      enabled: true
  #          lower-case-service-id: true
  # 路由策略
  routes:
    # 自定义的路由ID,保持唯一
    - id: memberservice
      # 请求路由条件
      predicates:
        - Path=/member/**
      # 转发目标服务地址,以lb://开头(lb代表从注册中心获取服务)
      uri: lb://mymemberservice
      # StripPrefix 转发到mymemberservice请求时不加则请求为http://member/GetMapping,加上则http://GetMapping
      filters:
        - StripPrefix=1

过滤器 GlobalFilter

解决请求参数乱码、用户权限认证等 ServerWebExchange#getRequest

请求限流

微服务的限流都是在gateway/nginx
https://www.cnblogs.com/pu20065226/p/11426279.html

限流算法

  1. 计数器
  2. 漏桶算法
  3. 令牌桶算法

跨域

@Configuration
public class CorsConfig {
    @Bean
    public CorsWebFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedMethod("*");
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**", config);

        return new CorsWebFilter(source);
    }
}

集群高可用

总之对外提供一个统一的入口。而后面都是集群,做高可用,高并发分流等等。

  • Nginx做网关集群,当一个网关挂机,可以通过配置,进行切换
  • Lvs做nginx集群,LVS+keepalive+nginx实现集群高性能负载均衡配置
  • DNS+VIP(虚拟IP)

待更新......

分布式事务 Seata

介绍

来自:网络资源
  1. 发起方TM申请构建全局事务协调者TC
  2. 发起方TM与TC建立一个长连接,并申请全局事务唯一ID
  3. 发起方TM调用RPC接口参与方RM,请求头中带上全局事务ID,生产undolog日志
  4. 参与方获取到全局事务ID,通知事务协调者TC加入该事务组中,生产undolog日志
  5. 一旦出现调用报错,则执行undolog日志,并通知事务协调者TC,统一回滚

使用

docker run --name seata-server -p 8091:8091 seataio/seata-server:latest

待更新......

分布式链路追踪

介绍

https://blog.didispace.com/spring-cloud-starter-dalston-8-4/

使用

  1. 执行命令
docker run -d --restart always -p 9411:9411 --name zipkin openzipkin/zipkin
  1. 配置
# 参考链接:https://zhuanlan.zhihu.com/p/125700427


    io.opentracing.contrib
    opentracing-spring-zipkin-web-starter
    0.1.4


# 分布式链路日志
opentracing:
  zipkin:
    enabled: true
    http-sender:
      base-url: http://localhost:9412/

或者

# 参考链接:https://www.jianshu.com/p/121d6b0c66fe)


    org.springframework.cloud
    spring-cloud-starter-zipkin


# 分布式链路日志
zipkin:
  base-url: http://192.168.207.128:9412/
  enabled: true
  service:
    name: ${spring.application.name}
  sender:
    type: web
sleuth:
  sampler:
    probability: 1.0

拓展:Nacos共享配置

shared-configs[0]:
  dataId:
  group:
  refresh: true
  1. Elasticsearch持久化
# zipkin分布式链路追踪
zipkin:
  ports:
    - 9411:9411
  image: "openzipkin/zipkin:2.18.0"
  environment:
    - STORAGE_TYPE=elasticsearch
    - ZIPKIN.STORAGE.ELASTICSEARCH.INDEX=zipkin
    - ZIPKIN.STORAGE.ELASTICSEARCH.INDEX-SHARDS=5
    - ZIPKIN.STORAGE.ELASTICSEARCH.INDEX-REPLICAS=1
    - ES_HOSTS=http://es:9200
  depends_on:
    - elasticsearch

# elasticsearch
es:
  image: "elasticsearch:7.12.0"
  ports:
    - 9200:9200
  environment:
    - "discovery.type=single-node"
    - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
  1. Zipkin + Kafka + Elasticsearch日志链路
    Kafka有削峰功能

服务健康监控 Springboot Admin

参考链接:https://www.jianshu.com/p/21c32276b2d3

作用

  1. 显示健康状况
  2. 显示详细信息
  3. JVM和内存指标
  4. 服务宕机告警

安装

参考链接:https://www.yuque.com/u1300481/kb/klibuc

安全权限认证

权限认证 oauth2

思想参考:https://www.cnblogs.com/msi-chen/p/13527032.html

来自:网路资源

实现参考:https://www.jianshu.com/p/d7146fa768ef

你可能感兴趣的:(03 springcloudalibaba)