springcloud微服务笔记

在这里插入图片描述

微服务模块步骤

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

各个组件目的:

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

Provider配置类
Application.yml文件:
在这里插入图片描述

服务注册中心

Eureka:

配置多集群,避免单点故障
application.yml
在这里插入图片描述

自身无需注册进Eurake中, 注册其他组件时:
pom中引入spring-cloud-starter-netflix-eureka-server,
其他类中引入spring-cloud-starter-netflix-eureka-client,添加 @EnableEurekaServer@EnableEurekaClient注解,yml中添加Eurake配置
在这里插入图片描述
在这里插入图片描述

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

  • 修改‪C:\Windows\System32\drivers\etc\hosts 文件 修改映射
  • 修改server的application.yml文件
    在这里插入图片描述
  • 修改client的application.yml文件

服务提供者单机变集群:

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

客户端config配置类中添加注解,提供负载均衡的能力
在这里插入图片描述

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

服务发现:

  1. Controller类中添加DiscoveryClient,discoveryClient方法
    在这里插入图片描述
  2. 主配置类中添加注解@EnableDiscoveryClient

Zookeeper:

yml配置
在这里插入图片描述

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配置文件
在这里插入图片描述
客户端yml配置文件
在这里插入图片描述

三者异同点

组件名语言CAP服务健康检查对外暴露接口SpringCloud集成
EurekaJavaAP可配支持HTTP已集成
ZookeeperJavaCP支持客户端已集成
ConsulGoCP支持HTTP/DNS已集成
NacosAP支持

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

服务调用

Ribbon

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Ribbon已在Eureka中集成
在这里插入图片描述

负载均衡+RestTemplate调用

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

在这里插入图片描述
Rule自带以上7种,一、如何替换 二、如何扩展手写一个

修改使用IRule,新建一个包,不能与主配置类在同一包下
在这里插入图片描述
在这里插入图片描述
在主配置类中添加注解:
在这里插入图片描述

Ribbon负载均衡算法

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

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

本地负载均衡器(P42 手写Ribbon轮询法)
自定义负载均衡类
在这里插入图片描述
controller中的方法
在这里插入图片描述

OpenFeign

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

服务降级

Hystrix(停更,设计理念)

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

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

客户端 e.g.:
在这里插入图片描述
主启动类注解:@EnableHystrix

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

  • 可配置全局fallback方法
    在这里插入图片描述
    在这里插入图片描述
    方法上添加@HystrixCommand注解

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

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

在这里插入图片描述
在这里插入图片描述

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

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
所有的参数方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

服务网关

  • 日志、限流、权限等
  • 微服务网关的理解以及选择
    在这里插入图片描述

Zuul2

GateWay

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

yml配置:
在这里插入图片描述
主启动类添加@EnableEurekaClient
负载均衡功能:
在这里插入图片描述
断言Predicate:
https://docs.spring.io/spring-cloud-gateway/docs/2.2.5.RELEASE/reference/html/#gateway-request-predicates-factories
在这里插入图片描述

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

自定义全局GlobalWayFilter过滤器
在这里插入图片描述

服务配置

Config

yml
在这里插入图片描述
主配置类 @EnableConfigServer
在这里插入图片描述
在这里插入图片描述
config 客户端 bootstrap.yml
在这里插入图片描述
在这里插入图片描述

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

客户端添加新配置
在这里插入图片描述

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

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


消息总线

RabbitMQ

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


在这里插入图片描述
在这里插入图片描述
即通过微服务名称和端口号
在这里插入图片描述

消息驱动

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

在这里插入图片描述

  • 消息的业务实现类
@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);
    }

}

分组消费与持久化

存在的问题:

  • 重复消费
  • 消息持久化
    在这里插入图片描述
    修改消费者yml文件即可
    在这里插入图片描述

分布式请求链路跟踪

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;
    }
}

在这里插入图片描述
在这里插入图片描述
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 将内存改小点(可不改)
    在这里插入图片描述
  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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值