springcloud微服务笔记

SpringCloud

    • 微服务模块步骤
      • 各个组件目的:
    • 服务注册中心
      • Eureka:
    • 服务发现:
      • Zookeeper:
      • Consul:
    • 服务调用
      • Ribbon
      • Ribbon负载均衡算法
      • OpenFeign
    • 服务降级
      • Hystrix(停更,设计理念)
    • 服务熔断:(关闭-开-半开)
    • 服务网关
      • Zuul2
      • GateWay
    • 服务配置
      • Config
    • 消息总线
      • RabbitMQ
    • 消息驱动
      • cloud stream
    • 分布式请求链路跟踪
      • Sleuth
  • SpringCloud Alibaba
    • 服务注册与配置中心
      • Nacos( = Eureka + Config + Bus)
      • Nacos Linux版本使用
      • 工具

springcloud微服务笔记_第1张图片

微服务模块步骤

  1. 建module
  2. 改pom
  3. 写xml
  4. 主启动类
  5. 业务类

各个组件目的:

是什么
解决了哪些问题
用在哪
怎么用的
即理念和落地的方案

Provider配置类
Application.yml文件:
springcloud微服务笔记_第2张图片

服务注册中心

Eureka:

配置多集群,避免单点故障
application.yml
springcloud微服务笔记_第3张图片

自身无需注册进Eurake中, 注册其他组件时:
pom中引入spring-cloud-starter-netflix-eureka-server,
其他类中引入spring-cloud-starter-netflix-eureka-client,添加 @EnableEurekaServer@EnableEurekaClient注解,yml中添加Eurake配置
springcloud微服务笔记_第4张图片
springcloud微服务笔记_第5张图片

Eureka服务注册中心单机变成集群:

  • 修改‪C:\Windows\System32\drivers\etc\hosts 文件 修改映射
  • 修改server的application.yml文件
    springcloud微服务笔记_第6张图片
  • 修改client的application.yml文件
    springcloud微服务笔记_第7张图片

服务提供者单机变集群:

将原server的com,mapper复制一份,修改端口号
客户端修改URL
在这里插入图片描述

客户端config配置类中添加注解,提供负载均衡的能力
springcloud微服务笔记_第8张图片

主机名称的规范和修改:
修改名称
打开IP显示
在这里插入图片描述

服务发现:

  1. Controller类中添加DiscoveryClient,discoveryClient方法
    springcloud微服务笔记_第9张图片
  2. 主配置类中添加注解@EnableDiscoveryClient

Zookeeper:

yml配置
springcloud微服务笔记_第10张图片

docker 中运行zookeeper
docker安装zookeeper后进入查看镜像内部文件的命令

  1. 查看容器是否启动
    docker ps
  2. 进入容器
    docker exec -it f76b7e25baa9 /bin/bash
  3. 进入bin目录
    cd bin
  4. 登录server
    zkCli.sh (-server 127.0.0.1:2181)
  5. 查看目录
    ls / , ls /services 查看zookeeper上的服务

服务节点是临时节点

Consul:

服务端yml配置文件
springcloud微服务笔记_第11张图片
客户端yml配置文件
springcloud微服务笔记_第12张图片

三者异同点

组件名 语言 CAP 服务健康检查 对外暴露接口 SpringCloud集成
Eureka Java AP 可配支持 HTTP 已集成
Zookeeper Java CP 支持 客户端 已集成
Consul Go CP 支持 HTTP/DNS 已集成
Nacos AP 支持

springcloud微服务笔记_第13张图片
springcloud微服务笔记_第14张图片
springcloud微服务笔记_第15张图片

服务调用

Ribbon

springcloud微服务笔记_第16张图片
springcloud微服务笔记_第17张图片
springcloud微服务笔记_第18张图片

Ribbon已在Eureka中集成
springcloud微服务笔记_第19张图片

负载均衡+RestTemplate调用

	IRule:根据特定算法从服务列表中选取一个要访问的服务:

springcloud微服务笔记_第20张图片
Rule自带以上7种,一、如何替换 二、如何扩展手写一个

修改使用IRule,新建一个包,不能与主配置类在同一包下
springcloud微服务笔记_第21张图片
springcloud微服务笔记_第22张图片
在主配置类中添加注解:
springcloud微服务笔记_第23张图片

Ribbon负载均衡算法

负载均衡算法原理: rest接口第几次请求数%服务器集群总数量=实际调用服务器位置下标,每次服务重启动后rest接口计数从1开始。

CAS 自旋锁 原理+JUC
https://www.bilibili.com/video/bv18b411M7xz/?spm_id_from=333.788.b_636f6d6d656e74.20

本地负载均衡器(P42 手写Ribbon轮询法)
自定义负载均衡类
springcloud微服务笔记_第24张图片
controller中的方法
springcloud微服务笔记_第25张图片

OpenFeign

Feign是–个声明式的web服务客户端,让编写web服务客户端变得非常容易,只需创建一个接口并在接口上添加注解即可
yml文件
springcloud微服务笔记_第26张图片
service接口
springcloud微服务笔记_第27张图片
controller类
springcloud微服务笔记_第28张图片
主配置类中添加 @EnableFeignClients 注解开启
Feign自带负载均衡配置项
springcloud微服务笔记_第29张图片
OpenFeign的超时控制
将服务端时间延长,OpenFeign默认等待1s,超时报错,可修改yml
springcloud微服务笔记_第30张图片
Feign提供了日志打印功能,对Feign接口的调用情况进行监控和输出
springcloud微服务笔记_第31张图片
在这里插入图片描述

服务降级

Hystrix(停更,设计理念)

解决服务雪崩
服务降级(fallback)、服务熔断(break)、服务限流(flowlimit)、接近实时的监控(Hystrix Dashboard)

Hystrix可放在服务端也可以放在客户端
默认是tomcat 线程池

客户端 e.g.:
springcloud微服务笔记_第32张图片
主启动类注解:@EnableHystrix

存在的问题:代码与兜底代码膨胀,混乱

  • 可配置全局fallback方法
    在这里插入图片描述
    springcloud微服务笔记_第33张图片
    方法上添加@HystrixCommand注解

  • 也可以在Service实现类中配置全局方法

#yml:
#开启全局Hystrix配置
feign:
  hystrix:
    enabled: true

在这里插入图片描述
springcloud微服务笔记_第34张图片

调用失败会触发降级,而降级调用fallback方法,但无论如何,降级的流程一定会先调用正常方法再调用fallback方法,加入单位时间内调用失败次数过多,也就是降级次数过多,则会触发熔断,熔断以后就会跳过正常方法直接调用fallback方法

服务熔断:(关闭-开-半开)

springcloud微服务笔记_第35张图片
springcloud微服务笔记_第36张图片
springcloud微服务笔记_第37张图片
所有的参数方法
springcloud微服务笔记_第38张图片
springcloud微服务笔记_第39张图片
springcloud微服务笔记_第40张图片
springcloud微服务笔记_第41张图片

服务网关

  • 日志、限流、权限等
  • 微服务网关的理解以及选择
    springcloud微服务笔记_第42张图片

Zuul2

GateWay

GateWay基于WebFlux(底层使用高性能Reactor模式的通信框架Netty),基于非阻塞异步模型
动态路由(Route)、断言(Predicate)、过滤器(Filter)

yml配置:
springcloud微服务笔记_第43张图片
主启动类添加@EnableEurekaClient
负载均衡功能:
springcloud微服务笔记_第44张图片
断言Predicate:
https://docs.spring.io/spring-cloud-gateway/docs/2.2.5.RELEASE/reference/html/#gateway-request-predicates-factories
springcloud微服务笔记_第45张图片

过滤器Filter
方法之前和之后,种类:GateWayFilter和GlobalWayFilter

自定义全局GlobalWayFilter过滤器
springcloud微服务笔记_第46张图片

服务配置

Config

yml
springcloud微服务笔记_第47张图片
主配置类 @EnableConfigServer
springcloud微服务笔记_第48张图片
springcloud微服务笔记_第49张图片
config 客户端 bootstrap.yml
springcloud微服务笔记_第50张图片
springcloud微服务笔记_第51张图片

存在的问题:需要重启才能更新数据
动态更新:

客户端添加新配置
springcloud微服务笔记_第52张图片

controller类中添加注解 @RefreshScope
修改完成
在这里插入图片描述
避免了服务重启

可用广播一次通知处处生效


消息总线

RabbitMQ

config服务端和服务端端添加依赖
springcloud微服务笔记_第53张图片
服务端添加配置 服务端口是15672,客户端口5672(下图有误)
springcloud微服务笔记_第54张图片
config客户端bootstrap.yml配置
springcloud微服务笔记_第55张图片
修改后发送
在这里插入图片描述
定点更新


springcloud微服务笔记_第56张图片
在这里插入图片描述
即通过微服务名称和端口号
springcloud微服务笔记_第57张图片

消息驱动

cloud stream

消息中间件MQ可能存在多种,用一种适配绑定的方式,自动在各种MQ之间切换
通过定义绑定器Binder,完美地实现了应用程序和消息中间件细节之间的隔离

生产者

  • yml文件
server:
  port: 8801
spring:
  application:
    name: cloud-stream-rabbitmq-provider8801
  cloud:
    stream:
      binders: #此处配置要绑定的rabbitmq的服务信息
        defaultRabbit: #表示定义的名称,用于binding的整合
          type: rabbit  #消息组件的类型
          environment:  #设置rabbitmq的相关环境配置
            spring:
              rabbitmq:
                host: 123.56.56.183
                port: 5672
                username: guest
                password: guest
      bindings: #服务的整合处理
        output: #这个名字是一个通道的名称
          destination: studyExchange #表示要使用的Exchange名称定义
          content-type: application/json #设置消息类型,本次为json,文本则设置“text/plain”
          binder: defaultRabbit #设置要绑定的消息服务的具体设置(无视报错)
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka,http://localhost:7001/eureka
  instance:
    lease-renewal-interval-in-seconds: 2 #设置心跳的时间间隔(默认是30秒)
    lease-expiration-duration-in-seconds: 5 #如果现在超过了5秒的间隔(默认是90秒)
    instance-id: send-8801.com #在信息列表时显示主机名称
    prefer-ip-address: true

springcloud微服务笔记_第58张图片

  • 消息的业务实现类
@EnableBinding(Source.class)    // 定义消息的推送管道
public class MsgServiceImpl implements MsgService {

    @Autowired
    private MessageChannel output;  // 消息的发送管道

    @Override
    public String send() {
        String serial = UUID.randomUUID().toString();
        output.send(MessageBuilder.withPayload(serial).build());
        System.out.println("*****serial" + serial);
        return null;
    }
}

消费者

  • yml
server:
  port: 8802
spring:
  application:
    name: cloud-stream-rabbitmq-consumer8802
  cloud:
    stream:
      binders: # 在此处配置要绑定的rabbitmq的服务信息;
        defaultRabbit: # 表示定义的名称,用于于binding整合
          type: rabbit # 消息组件类型
          environment: # 设置rabbitmq的相关的环境配置
            spring:
              rabbitmq:
                host: 123.56.56.183
                port: 5672
                username: guest
                password: guest
      bindings: # 服务的整合处理
        # **与生产者不同**
        input: # 这个名字是一个通道的名称
          destination: studyExchange # 表示要使用的Exchange名称定义

          content-type: application/json # 设置消息类型,本次为json,文本则设置“text/plain”
          binder: defaultRabbit  # 设置要绑定的消息服务的具体设置

eureka:
  client: # 客户端进行Eureka注册的配置
    service-url:
      defaultZone: http://localhost:7001/eureka,http://localhost:7001/eureka
  instance:
    lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)
    lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒)
    instance-id: receive-8802.com  # 在信息列表时显示主机名称
    prefer-ip-address: true     # 访问的路径变为IP地址

消费者

@Component
@EnableBinding(Sink.class)
public class ReceiveMessageListenerController {

    @Value("${server.port}")
    private String serverPort;

    @StreamListener(Sink.INPUT)
    public void input(Message<String> msg){
        System.out.println("消费者接收得到的消息-->" + msg.getPayload() + "    port:" + serverPort);
    }

}

分组消费与持久化

存在的问题:

  • 重复消费
  • 消息持久化
    springcloud微服务笔记_第59张图片
    修改消费者yml文件即可
    springcloud微服务笔记_第60张图片

分布式请求链路跟踪

Sleuth

服务端和客户端

  # 分布式请求链路追踪
  zipkin:
    base-url: http://localhost:9411
  sleuth:
    sampler:
      #采样率值介于0到1之间,1则表示全部采样
      probability: 1

SpringCloud Alibaba

服务注册与配置中心

Nacos( = Eureka + Config + Bus)

nacos自带负载均衡:已经集成了ribbon,自动轮询
ncaos 支持配置中心动态刷新

nacos作为注册中心
provider 主启动类添加 @EnableDiscoveryClient 注解
provider yml:

server:
  port: 9001
spring:
  application:
    name: cloudalibaba-provider-payment9001
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #配置nacos地址

management:
  endpoints:
    web:
      exposure:
        include: '*'

provider 控制类

@RestController
public class PaymentController {
    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id){
        return "nacos, serverPort:" + serverPort + "\t  id: " + id;
    }
}

创建2个provider 9001,9002

consumer 主启动类添加 @EnableDiscoveryClient 注解
consumer yml:

server:
  port: 83
spring:
  application:
    name: alibaba-consumer-order
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

service-url:
  nacos-user-service: http://cloudalibaba-provider-payment

consumer 配置类

@Configuration
public class ApplicationContentConfig {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

consumer 控制类

@RestController
@Slf4j
public class OrderNacosController {
    @Autowired
    private RestTemplate restTemplate;

    @Value("${service-url.nacos-user-service}")
    private String serverUrl;

    @GetMapping("/consumer/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Long id){
        return restTemplate.getForObject(serverUrl + "/payment/nacos/" + id, String.class);
    }
}

nacos作为配置中心
主启动类添加**@EnableDiscoveryClient**
2个yml:application.yml, bootstrap.yml
bootstrap.yml:

#nacos配置
server:
  port: 3377
spring:
  application:
    name: alibaba-config-client
  cloud:
    nacos:
#      discovery:
#        server-addr: localhost:8848 #nacos 服务注册中心地址
      config:
#        server-addr: localhost:8848 #nacos 作为配置中心地址
        file-extension: yaml #指定yaml格式的配置
#        namespace: 3ed29772-749b-4b1d-b495-07e4dbb233cb
#        group: TEST_GROUP

#${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}

application.yml

spring:
  profiles:
#    active: dev # 表示开发环境
    active: test # 表示测试环境

config控制类

@RestController
@RefreshScope // 支持nacos的动态刷新功能
public class ConfigClientController {

    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/getConfigInfo")
    public String getConfigInfo(){
        return configInfo;
    }
}

springcloud微服务笔记_第61张图片
springcloud微服务笔记_第62张图片
nacos集群配置和持久化存储
namespace + group + DataID

Nacos Linux版本使用

  1. 下载解压
  2. 修改 conf/applicaiton.properties 的端口配置和数据库配置。
  3. 修改 conf/cluster.conf 配置
192.168.107.130:8847
192.168.107.130:8848
192.168.107.130:8849
192.168.163.130:8847
192.168.163.130:8848
192.168.163.130:8849
  1. 修改 bin/startup.sh 将内存改小点(可不改)
    springcloud微服务笔记_第63张图片
  2. 复制解压后的 nacos 文件夹,取名nacos8848,nacos8849等。
  3. 分别进入bin目录启动 ./startup.sh

主启动类添加:@EnableDiscoveryClient

#yml
server:
  port: 8001

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ssms?serverTimezone=UTC
    username: root
    password: root
  application:
    name: ssms-manager
  #nacos 配置
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.163.130:8888

management:
  endpoints:
    web:
      exposure:
        include: '*'

工具

  • jmeter
  • postman
  • curl

你可能感兴趣的:(笔记)