网站多久会被百度收录,法律咨询微信网站建设,wordpress搭建ss,建设工程项目在哪个网站查询第一章 1、微服务零基础 2、从X和H版本说起 3、Cloud组件 4、微服务架构 5、Eureka服务注册与发现
第二章 6、Zookeeper 7、Consul 8、Ribbon均衡 9、OpenFeign 10、Hystrix断路器
第三章 11、…第一章 1、微服务零基础 2、从X和H版本说起 3、Cloud组件 4、微服务架构 5、Eureka服务注册与发现
第二章 6、Zookeeper 7、Consul 8、Ribbon均衡 9、OpenFeign 10、Hystrix断路器
第三章 11、zuul路由网关 12、Gateway 13、Config 14、Bus 15、Stream
第四章 16、Sleuth 17、Alibaba 18、Nacos 19、Sentinel 20、Seata
****************************************************************************************************************************************************************************
1、微服务零基础
【1】微服务架构4个核心问题
服务很多客户端该怎么访问
****************************************************************************************
这么多服务服务与服务之间如何通讯
****************************************************************************************
这么多服务怎么管理 注册中心、服务发现
****************************************************************************************
这么多服务服务挂了怎么办
****************************************************************************************
SpringCloudSpringCloud alibaba
****************************************************************************************
JAVA8MavenGitNginxRMQSpringBoot
****************************************************************************************
持续学习专注专业
【2】微服务与SpringCloud
****************************************************************************************
SpringCloud融合
一站式解决方案肯德基全家桶
****************************************************************************************
服务网关
服务注册发现
配置中心
容错限流
注册、调度、熔断、网关、配置、开发
****************************************************************************************************************************************************************************
2、从X和H版本说起【1】版本的选择
SpringBoot强烈建议升级到2.X
SpringCloud用H版
************************************************************************************
最终的对应关系
SpringCloud Hoxton.SR1
SpringBoot 2.2.2.RELEASE
SpringCloud Alibaba 2.1.0RElEASE
****************************************************************************************************************************************************************************
3、Cloud组件
【1】升级惨案
停更不停用
停课不停学
*******************************************************************************
服务注册发现中心------Eureka 停更 替换Zookeeper、Consul、Nacos推荐
服务调用-----Ribbon LoadBalancer Feign停更 OpenFeign推荐
服务降级-----Hystrix停更 Sentinel推荐
服务网关-----Zuul停更 gateway推荐
服务配置------Config停更 Nacos推荐
服务总线-----Bus停更 Nacos推荐
****************************************************************************************************************************************************************************
4、微服务架构
【1】父工程Project空间新建
约定配置编码
Project ----mudule
新建工程选择maven-archetype-site---选择maven自己的版本
设置编码都是UTF-8
注解激活生效 Compiler ---Annotation Processors --- Enable annotation processing
FileType过滤 *.idea *.iml
*********************************************************************************************
【2】父工程POM
参考终版吧
dependencyManagement能用到的都是父pom总管只有一个
在子pom只要不造反不指定版本号就是用父pom的版本号
子项目必须显示的声明需要用的依赖如果子项目不声明是不会从父项目中引用的
如果子项目指定了版本号就会用子项目的版本号
*********************************************************************************************
Maven中跳过单元测试
点击Maven中的小闪电就行了
记得动手
【3】支付模块构建
order 90
payment 9001
order模块调用payment模块
*********************************************************************************************
建module
改pom
写properties配置
主启动
业务类
前后端一体化vue-controller-service-dao-mysql
大厂vue ------------分离-------json--------------controller-service-dao-mysql
SQL----entities---dao---service--controller (9集13分钟)
一步步写太传统了到测试阶段了....
*********************************************************************************************配置日志
logback-spring.xml
复制如下内容
?xml version1.0 encodingUTF-8?
configuration scantrue scanPeriod60 seconds debugfalsecontextNamelogback/contextName!--输出到控制台--appender nameconsole classch.qos.logback.core.ConsoleAppenderencoderpattern%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n/pattern/encoder/appender!--按天生成日志,即一天只生成一个文件夹和一个日志文件--appender namelogFile classch.qos.logback.core.rolling.RollingFileAppenderPrudenttrue/PrudentrollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicyFileNamePatternapplog/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}.log/FileNamePattern/rollingPolicylayout classch.qos.logback.classic.PatternLayoutPattern%d{yyyy-MM-dd HH:mm:ss} -%msg%n/Pattern/layout/appender!-- logger节点可选节点作用是指明具体的包或类的日志输出级别以及要使用的appender可以把appender理解为一个日志模板。addtivity非必写属性是否向上级loger传递打印信息。默认是true--logger namecom.framework.job additivityfalseappender-ref refconsole/appender-ref reflogFile//logger!--项目的整体的日志打印级别为info--root levelinfoappender-ref refconsole/appender-ref reflogFile//root/configuration
#日志级别
logging.level.com.framework.jobinfo
*********************************************************************************************
完事万物需要简单化
post请求需要用postman
*********************************************************************************************总结
我的步骤建立SQL---POJO---Mapper---Controller
自律才能自由...
【4】热部署了解下就行了我还是需要手动启动谢谢了
【5】消费者订单模块正常都是80端口我是学习阶段直接90端口了
步骤建立module---改pom---写YML---主启动---业务类
*********************************************************************************************
httpClient
RestTemplate : 是访问restFul风格模板调用访问模块调用简单粗暴无脑
http://localhost:90/order/payment/select/31
返回{code:200,message:,object:{id:31,serial:HIT001}}
成功 牛批
RequestBody 阳哥竟然忘记了我日尼玛哦
*********************************************************************************************远程调用方式
package com.day.controller;
import com.day.pojo.Payment;
import com.day.pojo.Res;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;import javax.annotation.Resource;RestController
Slf4j
/*远程调用接口*/
RequestMapping(/order)
public class OrderController {public static final String PAYMENT_URL http://localhost:9001;Resourceprivate RestTemplate restTemplate;PostMapping(/payment/insert)public Res insert(RequestBody Payment payment) {// 90 调用 9001return restTemplate.postForObject(PAYMENT_URL /payment/insert, payment, Res.class);}GetMapping(/payment/select/{id})public Res select(PathVariable(id) Long id) {return restTemplate.getForObject(PAYMENT_URL /payment/select/ id, Res.class);}
}
【6】工程重构以为pojo是重复的所以需要重构
新建工程把pojo复制到common中然后其他的引入common的包
!--引入自定义通用API包--
dependencygroupIdorg.example/groupIdartifactIdcommon/artifactIdversion${project.version}/version
/dependency
****************************************************************************************************************************************************************************
5、Eureka服务注册与发现
零基础-初级-中级-高级
【1】注册中心-Eureka基础
服务治理调用、均衡....
Eureka集群、服务提供集群避免单点故障
Eureka连接着客户端与服务端
【2】单机版Eureka
***********************************************************************************单机版Eureka
端口7001建立module
!--eureka server--
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-server/artifactId
/dependency
!--引入自己定义的api通用包可以使用payment支付Entity--
dependencygroupIdorg.example/groupIdartifactIdcommon/artifactIdversion${project.version}/version
/dependency
***********************************************************************************
application.properties
server.port7001
#服务端实例名称
eureka.instance.hostnamelocalhost
#false表示不向注册中心注册自己
eureka.client.register-with-eurekafalse
#false表示自己端就是注册中心我的职责就是维护服务实例并不需要去检索服务
eureka.client.fetch-registryfalse
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
eureka.client.service-url.defaultZonehttp://${eureka.instance.hostname}:${server.port}/eureka/
***********************************************************************************
package com.day;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;SpringBootApplication
EnableEurekaServer
public class EurekaMain7001 {public static void main(String[] args) {SpringApplication.run(EurekaMain7001.class, args);}
}
***********************************************************************************入驻服务
http://localhost:7001/ 访问看到Eureka界面
引入EurekaClient pom-----配置properties----加EnableEurekaClient注解启动类完成
http://localhost:7001/ 访问看到启动的服务
同样引进order90服务
***********************************************************************************
server.port90
spring.application.namecloud-order-service
#eureka
#表示是否将自己注册进EurekaServer 默认为true
eureka.client.register-with-eurekatrue
#是否从EurekaServer抓取已有的注册信息默认为true。单节点无所谓集群必须设置为true才能配合ribbon使用负载均衡
eureka.client.fetch-registrytrue
eureka.client.service-url.defaultZonehttp://localhost:7001/eureka
【3】集群版Eureka
实现负载均衡和故障容错
***********************************************************************************
互相注册相互守望
7001 --7002互相指向
***********************************************************************************
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
***********************************************************************************
server.port7001
#服务端实例名称
eureka.instance.hostnameeureka7001.com
#false表示不向注册中心注册自己
eureka.client.register-with-eurekafalse
#false表示自己端就是注册中心我的职责就是维护服务实例并不需要去检索服务
eureka.client.fetch-registryfalse
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
eureka.client.service-url.defaultZonehttp://eureka7002.com:7002/eureka/
***********************************************************************************
server.port7002
#服务端实例名称
eureka.instance.hostnameeureka7002.com
#false表示不向注册中心注册自己
eureka.client.register-with-eurekafalse
#false表示自己端就是注册中心我的职责就是维护服务实例并不需要去检索服务
eureka.client.fetch-registryfalse
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
eureka.client.service-url.defaultZonehttp://eureka7001.com:7001/eureka/
***********************************************************************************
7001指向70027002指向7001
DS Replicas
eureka7002.comDS Replicas
eureka7001.com
***********************************************************************************
eureka.client.service-url.defaultZonehttp://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
***********************************************************************************注意网址端口
http://eureka7001.com:7001/
http://eureka7002.com:7002/
【4】服务的提供者也需要多个。微服务提供者
CLOUD-PAYMENT-SERVICE n/a (2) (2) UP (2) - 192.168.0.103:cloud-payment-service:9002 , 192.168.0.103:cloud-payment-service:9001
***********************************************************************************
localhost:9001 可以正常提供服务
localhost:9002 可以正常提供服务
localhost:90如何负载均衡的去访问9001与9002呢
用服务名称去找
// public static final String PAYMENT_URL http://localhost:9001;
public static final String PAYMENT_URL http://CLOUD-PAYMENT-SERVICE;
报错 java.net.UnknownHostException: CLOUD-PAYMENT-SERVICE
***********************************************************************************
开启RestTemplate的负载均衡
package com.day.config;import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;Configuration
public class APConfig {BeanLoadBalancedpublic RestTemplate getRestTemplate() {return new RestTemplate();}
}// applicationContent.xml
// 这个是以容器代码方式操作
***********************************************************************************
http://localhost:90/order/payment/select/31
访问就能看到默认的负载均衡机制
{code:200,message:,object:{id:31,serial:HIT001,端口号9002}}
{code:200,message:,object:{id:31,serial:HIT001,端口号9001}}
牛批了
【5】actuator微服务信息完善
#细节配置
eureka.instance.instance-idpayment9001
eureka.instance.prefer-ip-addresstrue
实现重命名机器IP地址显示
【6】服务发现Discovery
对于注册进eureka里面的微服务通过服务发现来获取该服务的信息。
EnableEurekaClient
EnableDiscoveryClient
***********************************************************************************
作用每一个服务都能拿到其他服务的信息
【7】Eureka自我保护机制
含义当某一时刻某个微服务不可用了Eureka不会立刻清理依旧会对该微服务的信息进行保存。
***********************************************************************************
默认情况下EurekaServer在一段时间某个微服务示例的心跳默认90秒。
设计哲学宁可保留错误的注册信息也不注销任何可能将康的实例。
【8】怎么禁止自我保护加深下认知而已。听下就行了反正最后也不会用这个
【9】Eureka停更说明
停更不停用。但是技术是在不断发展的还是需要学习新技术。
****************************************************************************************************************************************************************************
6、Zookeeper
【1】注册中心Zookeeper
关闭Linux服务器防火墙后不用操作启动zookeeper服务器开启端口访问是一样的...
zk取代Eurekazk作为服务注册中心
!--springboot整合zookeeper客户端--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-zookeeper-discovery/artifactId!--先排除自带的zookeeper3.5.3--exclusionsexclusion !--避免jar包冲突--groupIdorg.apache.zookeeper/groupIdartifactIdzookeeper/artifactId/exclusion/exclusions/dependency!--添加zookeeper3.4.14版本--dependencygroupIdorg.apache.zookeeper/groupIdartifactIdzookeeper/artifactIdversion3.4.14/versionexclusionsexclusiongroupIdlog4j/groupIdartifactIdlog4j/artifactId/exclusionexclusiongroupIdorg.slf4j/groupIdartifactIdslf4j-log4j12/artifactId/exclusion/exclusions/dependency
*************************************************************************************
server.port9004 支付服务注册进zookeeper
spring.application.namecloud-provider-payment
# 配置zookeeper 机器IP端口号, 这里可以用域名 牛批prettyzoo不能用端口号
spring.cloud.zookeeper.connect-stringwdfgdzx.top:2181
*************************************************************************************29集
客户端prettyZoo查看到服务成功入住信息如下:
{name:cloud-provider-payment,id:cacd6b1b-3d4c-4aee-8c18-49ee0be9e0a9,address:
192.168.0.103,port:9004,sslPort:null,payload:{class:org.springframework.cloud.zookeeper.discovery.ZookeeperInstance,
id:application-1,name:cloud-provider-payment,metadata:{}},registrationTimeUTC:1681051466420,serviceType:DYNAMIC,uriSpec:{parts:[{value:scheme,variable:true},{value:://,variable:false},{value:address,variable:true},{value::,variable:false},{value:port,variable:true}]}}
【2】配置临时还是持久节点
通过PrettyZoo可以看到只要服务停止了zookeeper的节点也就剔除了
说明服务节点是临时性的无情的zookeeper
【3】订单服务注册进zookeeper
90调用9004
*************************************************************************************config
package com.day.config;import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;Configuration
public class ACConfig {BeanLoadBalancedpublic RestTemplate getRestTemplate() {return new RestTemplate();}
}
*************************************************************************************controller
package com.day.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import javax.annotation.Resource;RestController
public class OrderZKController {public static final String INVOKE_URL http://cloud-provider-payment;Resourceprivate RestTemplate restTemplate;GetMapping(paymentInfo)public String paymentInfo() {return restTemplate.getForObject(INVOKE_URL /payment/zk, String.class);}
}
*************************************************************************************配置
server.port90
spring.application.namecloud-consumer-order
# 配置zookeeper 机器IP端口号, 这里可以用域名 牛批prettyzoo不能用端口号
spring.cloud.zookeeper.connect-stringwdfgdzx.top:2181
*************************************************************************************访问http://localhost:90/paymentInfo 调用成功 从90-----9004的服务
zookeeper9004 c887d0e6-cc23-4914-b88d-e7c3edad6cc7****************************************************************************************************************************************************************************
7、Consul
【1】概述服务发现、配置管理
zookeeper用的不多。
下载
https://developer.hashicorp.com/consul/downloads
【2】安装并运行Consul
解压cmd即可
consul agent -dev
*************************************************************************************
访问 简单到难以置信
http://localhost:8500/ui/dc1/services
运行成功好简单 卧槽
【3】服务提供者注册进consul
server.port8006
spring.application.nameconsul-provider-payment
#consul配置
spring.cloud.consul.hostlocalhost
spring.cloud.consul.port8500
spring.cloud.consul.discovery.service-name${spring.application.name}
【4】服务消费者注册进consul
server.port80
spring.application.nameconsul-consumer-order
#consul配置
spring.cloud.consul.hostlocalhost
spring.cloud.consul.port8500
spring.cloud.consul.discovery.service-name${spring.application.name}
*************************************************************************************
RestController
public class OrderController {public static final String INVOKE_URL http://consul-provider-payment;Resourceprivate RestTemplate restTemplate;GetMapping(/consul_order)public String consul() {return restTemplate.getForObject(INVOKE_URL /consul_payment, String.class);}
}
*************************************************************************************
Configuration
public class ACConfig {BeanLoadBalancedpublic RestTemplate getRestTemplate() {return new RestTemplate();}
}
*************************************************************************************
重点不是通过IP了是通过名字寻找对应的IP机器然后调用运行在上面的服务
【5】三个注册中心的异同点
Eureka AP
consul CP
zookeeper CP
*************************************************************************************
redis CP
MongDB CP
*************************************************************************************
CAP只能同时满足两个。
C一致性 A高可用 P分区容错性
Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性)****************************************************************************************************************************************************************************
8、Ribbon均衡
【1】启动原有Eureka项目访问
http://eureka7001.com:7001/
***********************************************************************************
【2】Ribbon负载均衡在order消费者侧的
Nginx是服务端的负载均衡大门。Ribbon是本地负载均衡本地负载均衡。
Nginx先进医院大门具体到哪个科室哪个医生看诊就是Ribbon负责了
***********************************************************************************
Ribbon就是 负载均衡RestTemplate调用
【3】Ribbon其实就是一个软负载均衡的客户端组件。
spring-cloud-starter-netflix-eureka-client 天生就引入了Ribbon
***********************************************************************************
二次说明RestTemplate
getForObject---返回json getForEntity---返回的是responseBody
我感觉记一个getForObject就OK了没必要
***********************************************************************************
IRule
RoundRobinRole 轮询
RandomRule 随机
RetryRole 重试
WeightedResponseTimeRule 响应越快被选择可能性越大
BestAvaliableRule 过滤掉多次访问故障处于断路器跳闸状态的服务
...
***********************************************************************************
rule必须和day平级因为SpringBootApplication自带ComponentScan。所以不行
***********************************************************************************
package com.rule;import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;Configuration
public class MyRule {Beanpublic IRule getMyRule() {return new RandomRule(); // 定义为随机}
}
***********************************************************************************
SpringBootApplication
EnableEurekaClient
RibbonClient(name CLOUD-PAYMENT-SERVICE, configuration MyRule.class)
public class OrderMain90 {public static void main(String[] args) {SpringApplication.run(OrderMain90.class, args);}
}
***********************************************************************************
重启下90端口就回看到是随机访问的了
【4】Ribbon负载均衡算法。算法原理。核心核心
rest接口第几次请求/ 服务器集群总数量2实际调用服务器位置下标。每次重启服务后rest接口从1开始。
***********************************************************************************
大道至简~~~~~~~~~~~~~~~~~~~6666
【5】RoundRobinRole 轮询源码分析
for循环
next 老师---设计模式感觉周阳老师的设计模式可以听一听
***********************************************************************************
纸上得来终觉浅绝知此事要躬行
【6】手写一个负载的算法
原理JUCCAS自旋锁的复习---后面可以再学习下吧。
****************************************************************************************************************************************************************************
9、OpenFeign 43集
【1】OpenFeign与Feign是一回事
Feign可以与Eureka和Ribbon组合使用以支持负载均衡
***********************************************************************************
让Web服务器客户端变的非常日容易
***********************************************************************************
RibbonRestTemplate整合Feign在这个基础上进一步封装。
***********************************************************************************
Feign比Ribbon用起来还简单。接口注解就调用了
***********************************************************************************
Feign已经被openFeign取代了用OpenFeign即可。
【2】OpenFeign服务调用
接口注解。微服务调用接口FeignClient
***********************************************************************************
package com.day;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;SpringBootApplication
EnableFeignClients // 激活开启Feign //
public class FeignOrderMain80 {public static void main(String[] args) {SpringApplication.run(FeignOrderMain80.class, args);}
}
***********************************************************************************
package com.day.service;import com.day.pojo.Res;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;Component
FeignClient(value CLOUD-PAYMENT-SERVICE) //
public interface PaymentFeignService {GetMapping(/payment_select/{id})Res payment_select(PathVariable(id) Long id);
}
***********************************************************************************
RestController
Slf4j
public class FeignOrderController {Resourceprivate PaymentFeignService paymentFeignService;GetMapping(/payment_select/{id})public Res payment_select(PathVariable(id) Long id) {return paymentFeignService.payment_select(id); // 变得好简单 卧槽}
}
***********************************************************************************
http://localhost/payment_select/31 一举成功调用完毕
{code:200,message:,object:{id:31,serial:HIT001,端口号9001}}
【3】OpenFeign的超时控制
Controller是面向接口编程...
***********************************************************************************
超时了怎么办
***********************************************************************************
This application has no explicit mapping for /error, so you are seeing this as a fallback.Sun Apr 16 21:36:45 CST 2023
There was an unexpected error (typeInternal Server Error, status500).
status 404 reading PaymentFeignService#payment_timeout()
feign.FeignException$NotFound: status 404 reading PaymentFeignService#payment_timeout()
***********************************************************************************指定超时时间
server.port80
eureka.client.register-with-eurekafalse
eureka.client.service-url.defaultZonehttp://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka
ribbon.ReadTimeout5000
ribbon.ConnectTimeout5000
logging.level.com.day.service.PaymentFeignServicedebug
***********************************************************************************
【4】OpenFeign日志增强
package com.day.config;import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;Configuration
public class FeignConfig {BeanLogger.Level feignLoggerLevel() {return Logger.Level.FULL;}
}
***********************************************************************************
logging.level.com.day.service.PaymentFeignServicedebug
***********************************************************************************
2023-04-16 21:44:54.215 DEBUG 14412 --- [p-nio-80-exec-2] com.day.service.PaymentFeignService : [PaymentFeignService#payment_timeout] --- GET http://CLOUD-PAYMENT-SERVICE/payment_timeout HTTP/1.1
2023-04-16 21:44:54.215 DEBUG 14412 --- [p-nio-80-exec-2] com.day.service.PaymentFeignService : [PaymentFeignService#payment_timeout] --- END HTTP (0-byte body)
2023-04-16 21:44:57.219 DEBUG 14412 --- [p-nio-80-exec-2] com.day.service.PaymentFeignService : [PaymentFeignService#payment_timeout] --- HTTP/1.1 200 (3003ms)
2023-04-16 21:44:57.219 DEBUG 14412 --- [p-nio-80-exec-2] com.day.service.PaymentFeignService : [PaymentFeignService#payment_timeout] connection: keep-alive
2023-04-16 21:44:57.219 DEBUG 14412 --- [p-nio-80-exec-2] com.day.service.PaymentFeignService : [PaymentFeignService#payment_timeout] content-type: application/json
2023-04-16 21:44:57.219 DEBUG 14412 --- [p-nio-80-exec-2] com.day.service.PaymentFeignService : [PaymentFeignService#payment_timeout] date: Sun, 16 Apr 2023 13:44:57 GMT
2023-04-16 21:44:57.219 DEBUG 14412 --- [p-nio-80-exec-2] com.day.service.PaymentFeignService : [PaymentFeignService#payment_timeout] keep-alive: timeout60
2023-04-16 21:44:57.219 DEBUG 14412 --- [p-nio-80-exec-2] com.day.service.PaymentFeignService : [PaymentFeignService#payment_timeout] transfer-encoding: chunked
2023-04-16 21:44:57.219 DEBUG 14412 --- [p-nio-80-exec-2] com.day.service.PaymentFeignService : [PaymentFeignService#payment_timeout]
2023-04-16 21:44:57.219 DEBUG 14412 --- [p-nio-80-exec-2] com.day.service.PaymentFeignService : [PaymentFeignService#payment_timeout] {code:401,message:演示超时 9001,object:null}
2023-04-16 21:44:57.219 DEBUG 14412 --- [p-nio-80-exec-2] com.day.service.PaymentFeignService : [PaymentFeignService#payment_timeout] --- END HTTP (58-byte body)
****************************************************************************************************************************************************************************
10、Hystrix断路器豪猪哥 47集
【0】el-upload文件传参让我搞了2个小时。阿西吧
【1】Hyystrix概述后面与阿里巴巴的sentinel结合断路器
设计非常优秀出道即巅峰
******************************************************************************
分布式系统面临的问题复杂的应用程序可能有数十个依赖如果有依赖挂了其他服务都挂了....
******************************************************************************
服务的高可用受到了侵害。
采用了服务熔断、降级的理念、接近实时的监控。
理念设计思想..
【2】Hystrix的重要概念
重要概念服务降级fallback、服务熔断break、flowlimit服务限流
服务熔断if else switch 对方代码不可用给别人一个友好的提示。服务器忙请稍后再试。
出现服务降级原因程序运行异常、超时、服务熔断、线程池/信号量打满
******************************************************************************
服务熔断
类似保险丝直接拒绝访问拉闸断电调用服务降级的方法并返回友好提示。
******************************************************************************
服务限流
秒杀搞并发等操作严谨一窝蜂拥挤大家排队N个人/秒有序进行
【3】Hystrix案例
保证服务调用方的线程不会被长时间、不必要的占用。从而避免故障在分布式系统中的蔓延乃至雪崩。
【4】JMeter高并发压测后卡顿不断发请求
023-04-20 21:55:52.459 INFO 15072 --- [o-8001-exec-127] com.day.controller.Controller : 发起一次请求
2023-04-20 21:55:52.459 INFO 15072 --- [o-8001-exec-177] com.day.controller.Controller : 发起一次请求
2023-04-20 21:55:52.459 INFO 15072 --- [io-8001-exec-79] com.day.controller.Controller : 发起一次请求
2023-04-20 21:55:52.459 INFO 15072 --- [io-8001-exec-31] com.day.controller.Controller : 发起一次请求
2023-04-20 21:55:52.459 INFO 15072 --- [nio-8001-exec-9] com.day.controller.Controller : 发起一次请求
******************************************************************************
连带着http://localhost:8001/hystrix/ok/2都被拖慢了。停止后
JMeter压测的非常成功牛批我的哥哥
http://localhost:8001/hystrix/ok/2就秒回了。
【5】52集订单微服务调用支付服务出现卡顿。8001自测都通不过。
假如现在客户端又来凑热闹....................
一般Hystrix用在消费端
******************************************************************************
HystrixMapper原则就是直接复制调用方的CLOUD-PROVIDER-HYSTRIX-PAYMENT
注册进http://eureka7001.com:7001/的
Controller方法。原封不动的复制
package com.day.mapper;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;Component
FeignClient(CLOUD-PROVIDER-HYSTRIX-PAYMENT)
public interface HystrixMapper {RequestMapping(/hystrix/ok/{id}) 注意路径一定写全// 不然报错status 404 reading HystrixMapper#error(Integer)public String ok(PathVariable(id) Integer id);RequestMapping(/hystrix/error/{id})public String error(PathVariable(id) Integer id);
}******************************************************************************配置
server.port80
eureka.client.register-with-eurekafalse
eureka.client.service-url.defaultZonehttp://eureka7001.com:7001/eureka/
ribbon.ReadTimeout10000
# feign.hystrix.enabledtrue // 豪猪哥还没用
******************************************************************************Controller
package com.day.controller;import com.day.mapper.HystrixMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;RestController
Slf4j
RequestMapping(/client)
public class Controller {Resourceprivate HystrixMapper hystrixMapper;RequestMapping(/ok/{id})public String ok(PathVariable(id) Integer id) {return hystrixMapper.ok(id);}RequestMapping(/error/{id})public String error(PathVariable(id) Integer id) {return hystrixMapper.error(id);}
}
******************************************************************************
客户端调用更慢了卧槽卡的一逼。
【6】53集降级容错解决的维度要求
超时导致服务器变慢超时不再等待
******************************************************************************
出错出错要有兜底
******************************************************************************
处理8001超时了超过N秒不等了
8001宕机了服务降级
8001 OK80自己超时出故障自己处理降级
【7】服务端降级注解替代编码 HystrixCommand--fallbackMethod 服务端
从8001找问题
******************************************************************************
RequestMapping(/error/{id})
HystrixCommand(fallbackMethod error_TimeoutHandler, commandProperties {HystrixProperty(name execution.isolation.thread.timeoutMilliseconds, value 3000)
})
public String error(PathVariable(id) Integer id) {try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}log.info(发起一次请求);return 线程池 Thread.currentThread().getName() error 耗时5秒钟 id;
}// 兜底方法
public String error_TimeoutHandler(PathVariable(id) Integer id) {return 线程池 Thread.currentThread().getName() id 不好意思触发超时兜底了~;
}
******************************************************************************
package com.day;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;SpringBootApplication
EnableEurekaClient
EnableCircuitBreaker
public class PaymentHystrixMain8001 {public static void main(String[] args) {SpringApplication.run(PaymentHystrixMain8001.class, args);}
}
******************************************************************************
client server 用端口标记具体是哪个server...说明要有自己的创新在学习中
mapper的写法加method说明必须要有老师必要步骤的继承....
******************************************************************************
http://localhost/client/error/1
线程池HystrixTimer-41 不好意思触发超时兜底了~
【8】客户端服务降级fallback--------当8001停掉的时候
http://localhost/client/error/1
我是客户端服务系统繁忙请10秒后再试或者自己运行出错检查自己...
【9】服务熔断
每个业务都对应兜底方法代码膨胀...
全局fallback
******************************************************************************
DefaultProperties(defaultFallback global_timeout_hand80)
public class Controller80 {
******************************************************************************
public String global_timeout_hand80() {return 全局兜底----我是客户端80服务端繁忙稍后再试或者自己运行出错...;
}
******************************************************************************解耦
package com.day.mapper;import org.springframework.stereotype.Component;Component
public class HystrixMapper80Iml implements HystrixMapper80 {Overridepublic String ok(Integer id) {return from HystrixMapper80 fall back---OK 方法, 兜底策略;}Overridepublic String error(Integer id) {return from HystrixMapper80 fall back---ERROR 方法, 兜底策略;}
}
******************************************************************************
【10】58集服务熔断 新理论
是应对雪崩效应的一种微服务链路保护机制。某个微服务出现不可用或者响应时间过长会进行服务的降级。
进而熔断改节点微服务的调用。快速返回错误的响应信息。
当检测到该节点微服务正常响应后----恢复调用链路。自我修复
******************************************************************************
开------挂-----调用影响正常后-------半开------开
******************************************************************************
【11】 服务熔断案例上 59集// 服务熔断HystrixCommand(fallbackMethod serverCircuitBreak_fallback, commandProperties {HystrixProperty(name circuitBreaker.enabled, value true), // 是否开启断路器HystrixProperty(name circuitBreaker.requestVolumeThreshold, value 10), // 请求次数HystrixProperty(name circuitBreaker.sleepWindowInMilliseconds, value 10000), // 时间范围HystrixProperty(name circuitBreaker.errorThresholdPercentage, value 60), // 失败率达到多少后跳闸})public String serverCircuitBreak(PathVariable(id) Integer id) {if (id 0) {throw new RuntimeException(id不能为负数...);}String serialNumber IdUtil.simpleUUID();return Thread.currentThread().getName() ----调用成功流水号 serialNumber;}public String serverCircuitBreak_fallback(PathVariable(id) Integer id) {return id 不能为负数请稍后再试id id;}
******************************************************************************这些配置肯定from官网
【12】60集 服务熔断案例下// 服务熔断GetMapping(/circuit/{id})public String serverCircuitBreak(PathVariable(id) Integer id) {log.info(serverMethod8001.serverCircuitBreak(id));return serverMethod8001.serverCircuitBreak(id);}
******************************************************************************
http://localhost:8001/hystrix/circuit/56
一开始整数是正常的
hystrix-ServerMethod8001-10----调用成功流水号55e75822da2145cc831980d44164ac6d
******************************************************************************id 不能为负数请稍后再试id-10 不断的点击----跳闸
******************************************************************************
id 不能为负数请稍后再试id12 正的都报错了
******************************************************************************不断刷才正常
后面慢慢的才正常
hystrix-ServerMethod8001-10----调用成功流水号1fc24f5b68ea40dbb1e254236edc92ba【13】理论-实操-总结 三板斧熔断的打开----关闭-----半开
******************************************************************************
// 服务熔断
HystrixCommand(fallbackMethod serverCircuitBreak_fallback, commandProperties {HystrixProperty(name circuitBreaker.enabled, value true), // 是否开启断路器HystrixProperty(name circuitBreaker.requestVolumeThreshold, value 10), // 请求次数HystrixProperty(name circuitBreaker.sleepWindowInMilliseconds, value 10000), // 时间范围HystrixProperty(name circuitBreaker.errorThresholdPercentage, value 60), // 失败率达到多少后跳闸
})
public String serverCircuitBreak(PathVariable(id) Integer id) {if (id 0) {throw new RuntimeException(id不能为负数...);}String serialNumber IdUtil.simpleUUID();return Thread.currentThread().getName() ----调用成功流水号 serialNumber;
}public String serverCircuitBreak_fallback(PathVariable(id) Integer id) {return id 不能为负数请稍后再试id id;
}
******************************************************************************
快照时间窗、请求总数阀值、错误百分比阈值。
【14】62集 工作流程最后总结。了解吧重点学习通用的技术。不过是大佬们解决问题的一种方法而已。
HystrixCommand
【15】服务监控HsytrixDashboard 豪猪哥仪表盘
http://localhost:9001/hystrix 有豪猪哥的头像
******************************************************************************
Bean
public ServletRegistrationBean getServlet() {HystrixMetricsStreamServlet streamServlet new HystrixMetricsStreamServlet();ServletRegistrationBean registrationBean new ServletRegistrationBean(streamServlet);registrationBean.setLoadOnStartup(1);registrationBean.addUrlMappings(/hystrix.stream);registrationBean.setName(HystrixMetricsStreamServlet);return registrationBean;
}
******************************************************************************填写地址
http://localhost:8001/hystrix.stream
******************************************************************************
流量的上升与下降... 等等
******************************************************************************
9001仅监控了8001 当然也可以监控其他的。没问题....牛批
****************************************************************************************************************************************************************************
11、zuul路由网关不重点用GateWay作用了解 65集
【1】服务网关挂号窗口治疗医生的分配
【2】Zuul ---Zuul2---gateway
****************************************************************************************************************************************************************************
12、Gateway
【1】是什么
提供统一的路由方式基于Filter链的方式提供了网关基本的功能。如安全、监控、限流。
****************************************************************************************能干什么
反向代理、鉴权、流量控制、熔断、日志监控...
****************************************************************************************
外部请求 手机、H5、Open接口
负载均衡Nginx
网关gateway
微服务 A B C D
【2】gateway是非阻塞异步模型 牛批
gateway是Springcloud的亲儿子
****************************************************************************************
springcloud gateway是一个非常好的网关选择
****************************************************************************************
亲儿子稳定性和springboot结合更稳定
****************************************************************************************
动态路由能够匹配任何请求属性
可以对路由指定predicate断言和Filter过滤器
集成了Hystrix的断路器功能
易于编写的predicate断言和Filter过滤器
请求限流功能
支持路径重写。
感觉越学越像VUE的router...................
****************************************************************************************
springcloud gateway 支持websocket 长连接卧槽 牛批
天下武功 唯快不破先出来再完美。
****************************************************************************************
spring webflux
servelet 3.1之后出现了一个非阻塞的支持。
【3】gateway工作流程 68集
三大核心概念
Route 路由 具体发给哪个URL的微服务
Predicate 断言如果请求与断言相匹配则进行“路由”你有讯飞的工牌才能进讯飞公司。
Filter过滤请求被路由前或者路由后对请求进行修改这不是next to吗 卧槽呀。你的标签你是好员工还是差员工...
****************************************************************************************
工作流程
客户端-----geteway发请求-----getaway根据handlerMappering找到匹配的路由转发------
gateway web handler将请求送到实际的服务执行业务逻辑然后返回。
****************************************************************************************
Filter在pre类型的过滤器可以做参数校验、权限校验、流量控制、日志输出、协议转换等。
在post类型过滤器中可以做响应内容、日志的输出、流量监控等...
【4】gateway 9527 搭建 69集
访问http://eureka7001.com:7001/
****************************************************************************************
看到相关服务如下
Application AMIs Availability Zones Status
GATEWAY n/a (1) (1) UP (1) - 192.168.0.103:gateway:9527
SERVER n/a (1) (1) UP (1) - 192.168.0.103:server:8001
****************************************************************************************
说明网关配置生效了
http://localhost:8001/server/get/34 能访问
http://localhost:9527/server/get/34 也能访问
http://localhost:9527/server/lb 也能访问....
【5】70集 配置路由的两种方式
不再暴露真是的服务端口。id不要重复就可以。http://localhost:9527/server/lb 返回8001
****************************************************************************************配置网关路由的两种方式在配置文件properties中配置见前面的步骤。在代码中注入Routelocator的Bean感觉有点不实用
****************************************************************************************怎么感觉和配置hosts重定向一样呢.... RTM
【6】71集 配置动态路由通过微服务名实现动态路由。****************************************************************************************lb://server 这个server是8001与8002端口的spring.application.nameserver不要搞错了server.port9527
spring.application.namegateway
eureka.instance.hostnamegateway-service
eureka.client.service-url.register-with-eurekatrue
eureka.client.service-url.fetch-registrytrue
eureka.client.service-url.defaultZonehttp://eureka7001.com:7001/eureka
#配置网关 开启从注册中心动态创建路由工鞥呢利用微服务名进行路由...
spring.cloud.gateway.discovery.locator.enabledtrue
#没有固定规则但是要求唯一
spring.cloud.gateway.routes[0].idserver_routh1
# lb:// 服务提供方的名称在8001端口的application.properties配置的
spring.cloud.gateway.routes[0].urilb://server
spring.cloud.gateway.routes[0].predicates[0]Path/server/get/**
#第二个
spring.cloud.gateway.routes[1].idserver_routh2
spring.cloud.gateway.routes[1].urilb://server
spring.cloud.gateway.routes[1].predicates[0]Path/server/lb/**
****************************************************************************************server.port8001
spring.application.nameserver
eureka.client.register-with-eurekatrue
eureka.client.fetch-registrytrue
eureka.client.service-url.defaultZonehttp://eureka7001.com:7001/eureka/
****************************************************************************************server.port8002
spring.application.nameserver
eureka.client.register-with-eurekatrue
eureka.client.fetch-registrytrue
eureka.client.service-url.defaultZonehttp://eureka7001.com:7001/eureka/
****************************************************************************************
http://localhost:9527/server/lb
8001 8002交替返回实现了负载均衡。牛批了我的哥哥
【7】72集Gateway常用的Predicate
2023-04-25 21:39:09.549 INFO 16504 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [After]
2023-04-25 21:39:09.549 INFO 16504 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Before]
2023-04-25 21:39:09.549 INFO 16504 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Between]
2023-04-25 21:39:09.549 INFO 16504 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Cookie]
2023-04-25 21:39:09.549 INFO 16504 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Header]
2023-04-25 21:39:09.549 INFO 16504 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Host]
2023-04-25 21:39:09.549 INFO 16504 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Method]
2023-04-25 21:39:09.549 INFO 16504 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Path]
2023-04-25 21:39:09.549 INFO 16504 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Query]
2023-04-25 21:39:09.549 INFO 16504 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [ReadBodyPredicateFactory]
2023-04-25 21:39:09.549 INFO 16504 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [RemoteAddr]
2023-04-25 21:39:09.549 INFO 16504 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Weight]
2023-04-25 21:39:09.549 INFO 16504 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [CloudFoundryRouteService]
****************************************************************************************
#第二个
spring.cloud.gateway.routes[1].idserver_routh2
spring.cloud.gateway.routes[1].urilb://server
spring.cloud.gateway.routes[1].predicates[0]Path/server/lb/**
spring.cloud.gateway.routes[1].predicates[1]After2023-04-25T21:59:27.36908:00[Asia/Shanghai]
****************************************************************************************
如果在After之前访问会报错404
http://localhost:9527/server/lb
[ca137ffd] There was an unexpected error (typeNot Found, status404).
****************************************************************************************
断言的作用就是加更多的条件。
****************************************************************************************
JMeter/postman/curl
curl http://localhost:9527/server/lb相当于postman的命令界面
{timestamp:2023-04-25T13:58:59.3060000,path:/server/lb,status:404,error:Not Found,message:null,requestId:c44e52fd}
****************************************************************************************
curl http://localhost:9527/server/lb --cookie usernamezzyy
就会不断的返回8001 8002
C:\Users\Administratorcurl http://localhost:9527/server/lb --cookie usernamezzyy
8002
C:\Users\Administratorcurl http://localhost:9527/server/lb --cookie usernamezzyy
8001
****************************************************************************************
Header断言...等等 不一个个看了
curl http://localhost:9527/server/lb -H “X-Request-Id:123”
其他的自己百度测试.....
Method Query
****************************************************************************************
讲道理和VUE的router还真有点像牛批
【8】73集 Gateway的Filter
使用过滤器可以在请求被路由前或者之后对请求进行修改统一处理呗
可以形成过滤链。
****************************************************************************************
常用的过滤器
****************************************************************************************
自定义过滤器 implements GlobalFilter,Ordered
用来搞全局日志、统一网关鉴权等
****************************************************************************************
package com.day.filter;import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import java.util.Date;Component
Slf4j
public class GatewayLogFilter implements GlobalFilter, Ordered {Overridepublic MonoVoid filter(ServerWebExchange serverWebExchange, GatewayFilterChain gatewayFilterChain) {log.info(***************come in GatewayLogFilter new Date());String uname serverWebExchange.getRequest().getQueryParams().getFirst(uname);if (uname null) {log.info(****************用户名为null非法用户...);serverWebExchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);return serverWebExchange.getResponse().setComplete();}return gatewayFilterChain.filter(serverWebExchange);}Overridepublic int getOrder() {return 0;}
}****************************************************************************************
http://localhost:9527/server/lb?unamezs
http://localhost:9527/server/lb 不带uname都过滤掉了
****************************************************************************************************************************************************************************
13、Config 74集
【1】服务配置config 服务总线bus 都被Nacos替代了
aplication.properties太多了怎么处理
所以要有统一的配置管理环境对吧
dev test product环境的配置管理
动态的配置管理设施必不可少的
ConfigServer来处理。
**********************************************************************************************
作用
集中管理配置文件
不通过环境不通过配置动态化的配置更新
运行期间动态调整配置
当配置发生变化时服务不需要重启
配置信息以REST接口暴露
【2】Config服务端配置与测试了解吧重点学习nacos) 75集3分钟
GitHub新建一个名为config的新Repository仓库
由上一步获取到git地址
clone到本地
**********************************************************************************************
需要配置git地址、分支感觉肯定没有nacos方便
config-3344.com
**********************************************************************************************
http://config-3344.com:3344/master/config-dev.yml
http://config-3344.com:3344/master/config-test.yml
http://config-3344.com:3344/master/config-pro.yml
【3】76集 config客户端配置与测试
bootstrap.yml优先级更高 是与外部沟通的。
application.yml是内部用的给自己用的。
**********************************************************************************************
3355——3344—到远程git拉取配置
**********************************************************************************************
http://localhost:335/configInfo
和3344对应访问的一致。
**********************************************************************************************
但是问题是Git刷新后3355的版本信息并没有随之更新就存在问题了不可能每次都重置335
那么客户端动态刷新怎么处理
【4】77集 config动态刷新之手动版
修改3355模块添加web与actuator监控模块。
**********************************************************************************************
3355配置里暴露监控端点。
management.endpoints.web.exposure.include*
**********************************************************************************************
在业务类Controller上面加RefreshScope
但是还没解决卧槽
**********************************************************************************************
需要运维人员发送Post请求刷新3355
curl -X POST http://localhost:3355/actuator/refresh
相当于激活下3355获取下最新文件。
这样4就同步过来了。
**********************************************************************************************
改远程git的配置命令curl刷新就解决了重启才能刷新的问题避免了服务重启
**********************************************************************************************
还有什么问题呢
小厂去用基本没有什么问题了。
可否广播一次通知处处生效
可以技术方案就是Bus
消息总线牛批
****************************************************************************************************************************************************************************
14、Bus 消息总线 78集
【1】是什么支持两种消息代理RMQ和Kafka
POST Bus/refresh
***************************************************************************************
将分布式系统的节点与轻量级消息系统连接起来的框架整个了java事件处理机制和消息中间件的功能。
***************************************************************************************
微服务架构中通常使用轻量级的消息代理来构建一个公用的消息主体并让系统中所有微服务实例
都连接上来。改主体产生的消息会被所有的实例监听所以它被称为“消息总线”。
***************************************************************************************
类似于微信公众号他的通知功能很牛批
【2】RMQ环境配置后面还得巩固下RMQ
安装Erlang
安装RMQ
进入RMQ安装目录下的sbin目录
输入一下命令启动管理功能
访问地址查看是否安装成功 http://localhost:5672
输入账号密码登录guest guest
【3】新建3366端口依然通过git config配置application.yml
利用总线消息触发一个客户端/bus/refresh。
利用总线消息触发一个服务端ConfigServer的/bus/refresh端点。刷新所有的客户端的配置。建议用第二个
【4】RMQ的相关配置
spring.rabbitmq.hostlocalhost
spring.rabbitmq.port5672
spring.rabbitmq.usernameguest
spring.rabbitmq.passwordguest
暴露bus刷新节点
***************************************************************************************
curl -X POST http://localhost:3344/actuator/bus-refresh 只需要刷新服务端的即可
达到了一次修改广播通知处处生效的效果。
【5】动态刷新的定点通知
公式http://localhost:3344/actuator/bus-refresh/{目标}
curl -X POST http://localhost:3344/actuator/bus-refresh/config-client:3355
****************************************************************************************************************************************************************************
15、Stream
【1】为什么引入Stream它解决了什么痛点
消息中间件
ActiveMQ
RabbitMQ
RocketMQ
Kafka
*********************************************************************************************
前端 -----后端 ------------大数据
可能存在两个MQ.... 切换、维护、开发都带来了问题有没有一种新技术让我们不再关注MQ的细节
只需要一种适配绑定的方式自动的给我们在各种MQ切换
类似于Springboot的思想把底层的东西留给历史了
*********************************************************************************************
只需要操作Stream其他的就不用管了。牛批
这就是它出现的原因。
【2】实现Binder 绑定器
Stream是构建消息驱动微服务的框架。
binder对象负责与消息中间件交互。目前仅支持RMQ、Kafka
【3】Stream 的设计思想
标准MQ消息----通道----谁负责发谁负责处理
*********************************************************************************************
Stream中消息通信方式遵循了发布-订阅模式
Topic主体进行广告
*********************************************************************************************
通过Binder作为中间器屏蔽了底层的消息处理技术。
【4】Stream编码常用注解概述
Binder/Channel/Source和sink
【5】消息驱动值生产者8801
太多的理论与记录不如去官网安装最新的直接登录了日尼玛
http://localhost:15672 guest guest
*********************************************************************************************
启动7001
启动RMQ
启动8801
*********************************************************************************************
Qualifier(output)
Resource
private MessageChannel messageChannel; // 消息发送管道
不然可能会报错的
*********************************************************************************************
1、port端口号只能写5672虽然浏览器地址是http://localhost:15672但是在配置文件里面只能写5672
注意是5672 卧槽 坑爹呢不是
2、登录账户不能写guest因为guest默认为rabbitmq的管理员账号只允许在本地也就是浏览器页面登录
不允许远端登录需要配置但是可能会很麻烦。所以好的解决办法就是在rabbitmq新建一个用户然后
赋予权限用新建用户进行登录。然后问题就解决啦亲测有效
*********************************************************************************************
发消息后在OverView界面能够看到Message rates的监控图形变化。
【6】88集 消息驱动消费者
生产者
serial c983887c-d5f3-4e1c-b590-45f9f84a4e78
*********************************************************************************************
消费者
消费者1号-----接受到的消息c983887c-d5f3-4e1c-b590-45f9f84a4e78 端口号8802
*********************************************************************************************
不觉明历
【7】89集 消息重复消费问题
根据8802复制一份工程到8803
8801 8802 8803 三台机器
*********************************************************************************************
运行后的两个问题重复消费问题、消息持久化问题。
serial 21c98066-088e-42be-86bf-fc52009d892c
消费者1号-----接受到的消息21c98066-088e-42be-86bf-fc52009d892c 端口号8802
消费者2号-----接受到的消息21c98066-088e-42be-86bf-fc52009d892c 端口号8803
说明21c98066-088e-42be-86bf-fc52009d892c 消息被重复消费了......
*********************************************************************************************
分组的概念
以上问题说明8802 与 8803是在不同的组的。怎么处理呢
需要用到Stream处于同一个group中。
结论不同的组是可以重复消费的同一个组只有其中一个可以消费。
说白了就是在RMQ中Queue的名字不同
studyExchange.anonymous.VAiHFeRIR4G-hJkV_O_wlQ
studyExchange.anonymous.Y8RFvLWaTICPmjXf7mr-Bw
【8】90集解决消息重复消费的问题
自定义配置分组--自定义配置为同一个分组---解决重复消费问题
在两个模块的项目中分别配置
spring.cloud.stream.bindings.input.groupwdfgdzx002
spring.cloud.stream.bindings.input.groupwdfgdzx003
*********************************************************************************************
而对应的RQM变成了如下的名称
Queue studyExchange.wdfgdzx002
Queue studyExchange.wdfgdzx003
*********************************************************************************************
那么都配置成
spring.cloud.stream.bindings.input.groupwdfgdzx
当8801发送两条消息
serial a587864a-4732-4942-abc4-4b5209925484
serial 600d0d40-7741-4352-8a93-4e5466107985
消费者1号-----接受到的消息a587864a-4732-4942-abc4-4b5209925484 端口号8802
消费者2号-----接受到的消息600d0d40-7741-4352-8a93-4e5466107985 端口号8803
就解决重复消费问题
【9】持久化
8801在8802 8803宕机的情况下发送4条消息。
如果8802没有group假如删除不配置group了重启后并不会消费历史生产内容。
而8803有group会消费历史上8801生产的消息.....牛批
消费者2号-----接受到的消息3d2b82f2-0515-4d9f-a333-68ae5c6c7b8c 端口号8803
消费者2号-----接受到的消息dd53b7a5-11ec-42d1-8d99-028f683507d9 端口号8803
消费者2号-----接受到的消息878f4a38-973e-4f68-bcbb-7bbe405bff48 端口号8803
消费者2号-----接受到的消息53b71c6e-c0ea-4d7a-b91d-de89ec12e550 端口号8803
****************************************************************************************************************************************************************************
16、Sleuth
【1】分布式请求链路跟踪
在微服务中一个客户端发起的请求在后端系统中会经过不同的服务节点用来协同产生最后的请求
结果每一个请求都会形成一个复杂的分布式服务调用链路链路中任何一环出现高延时或者错误都会
导致“最后整个请求的失败”。
*************************************************************************************************
Sleuth提供了一套完整的服务跟踪解决方案。并且支持zipkin
【2】93集 Sleuth之zipkin搭建安装
https://repo1.maven.org/maven2/io/zipkin/zipkin-server/
下载最新版
*************************************************************************************************
java -jar zipkin-server-2.24.1-exec.jar 后台http://127.0.0.1:9411/zipkin/ 前端
*************************************************************************************************
服务1 服务2 服务3 4....
*************************************************************************************************
Trace类似于树结构的Span集合表示一条调用链路存在唯一标识。traceId
span表示调用链路来源每一个span就是一次请求信息
【3】94集 完成一个简单的调用
artifactIdstream-rmq-server8801/artifactIddependencies!--包含了sleuthzipkin--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-zipkin/artifactId/dependency
*************************************************************************************************
# 配置链路监控 # 1表示全部采集正常使用0.5也可以
spring.zipkin.base-urlhttp://localhost:9411
spring.sleuth.sampler.probability1
这就完成了调用记录的演示。
****************************************************************************************************************************************************************************
17、Alibaba 这才是最牛批的王道
【1】为什么需要Spring Cloud Alibaba
因为spring cloud的很多技术都进入了停更、维护模块。
*****************************************************************************************
Dubbo阿里 ---SpringCloudNetflix2018包一下
阿里巴巴又包了上面的技术....反包
美团和阿里的兄弟们用java用的是最多的....
*****************************************************************************************
阿里云---阿里的商业运营很厉害腾讯是社交、百度是技术阿里是运营。
*****************************************************************************************
带来了什么
2018阿里巴巴Spring Cloud Alibaba正式入驻了Spring Cloud官方孵化器并在Maven中央库发布了第一个版本。
*****************************************************************************************
能干什么
服务限流降级
服务注册与发现
分布式配置管理
消息驱动能力
阿里云对象存储
分布式任务调度
基本能把前面的16章的技术全部替换掉卧槽
*****************************************************************************************
https://github.com/alibaba/spring-cloud-alibaba/blob/2.2.x/README-zh.md
官网记录下。
****************************************************************************************************************************************************************************
18、Nacos
【1】服务注册与配置中心EurekaGit...
Naming和Configuration的前两个字母最后s为service
*****************************************************************************************
动态的服务发现、配置管理和服务管理平台就是注册中心配置中心
NacosEurekaConfigBus
*****************************************************************************************
https://github.com/alibaba/Nacos
【2】安装运行Nacos
链接https://pan.baidu.com/s/1y2r9bl7sexqlk0mPLN12Ow
提取码rwck
到bin目录starup打开改写java bin路径
if not exist C:\IT\JDK1.8\bin\java.exe echo Please set the JAVA_HOME variable in your environment, We need java(x64)! jdk8 or later is better! EXIT /B 1
set JAVAC:\IT\JDK1.8\bin\java.exe
*****************************************************************************************
启动startup.cmd -m standalone
http://localhost:8848/nacos 访问看到界面
【3】服务提供者注册server
服务列表能看到alibaba-server9001说明注册成功
再建立个9002服务提供者server9002
【4】99集 消费者client注册和负载
建立两个名字统一为alibaba-server90019002 // 不能有特殊字符 注意哈
*****************************************************************************************
http://localhost/client/nacos/19
来自nacos注册中心端口号9001 id是19
来自nacos注册中心端口号9002 id是19
*****************************************************************************************
server90019002client80都成功注册进了nacos
【5】100集 服务中心的对比
Nacos可以切换CP AP模式。
性感荷官在线发牌姿势可以切换。
【6】101集 Nacos服务配置中心
这一章非常重要
*****************************************************************************************
一定要先粘贴pom不然application.properties都不能是被为绿叶子
RefreshScope // 保持nacos动态刷新
*****************************************************************************************
Nacos的配置规则
spring.application.nameclient3377
spring.profiles.activedev
*****************************************************************************************
client3377-dev.properties 对应的nacos就要配置对应的文件名
*****************************************************************************************
所以本地配置拉取和nacos是一一对应的spring.application.name-spring.profiles.active.properties
*****************************************************************************************
config.infofrom nacos by wdfgdzx
*****************************************************************************************
http://localhost:3377/client3377_info
from nacos by wdfgdzx
*****************************************************************************************
卧槽好方便那我以后用nacos配置开发了沃日哦
【7】102 Nacos命名空间、分组、DataID三者之间的关系
配置多了怎么管理
*****************************************************************************************
namespace是可以区分部署环境的。Group和dataID逻辑上区分目标对象。
默认情况
namespacepublic
GroupDEFAULT_GROUP
ClusterDEFAULT
*****************************************************************************************
不同的namespace之间是隔离的
Group可以把不同的微服务划分到一个组解决订单重复消费问题
*****************************************************************************************
Service就是微服务 HZ杭州 GZ 广州
【8】103集 Nacos配置Data ID
更改application.properties的修改test后自动从nacos的client3377-test.properties读取内容
spring.profiles.activetest
http://localhost:3377/client3377_info
返回test from nacos
*****************************************************************************************
讲道理项目小的话DEFAULT_GROUP都够用的但是吧这是微服务项目肯定不太小.....
【9】Nacos配置之Group分组方案
dev_group
*****************************************************************************************
spring.cloud.nacos.config.groupdev_group
spring.profiles.activeinfo
http://localhost:3377/client3377_info
返回from nacos dev_group info
【10】Nacos配置之namespance这个是最大的区分
*****************************************************************************************
# 这个优先级最高所以nacos配置要放到这个文件里
server.port3377
spring.application.nameclient3377
spring.cloud.nacos.discovery.server-addrlocalhost:8848
# 读取配置文件
spring.cloud.nacos.config.server-addrlocalhost:8848
spring.cloud.nacos.config.file-extensionproperties
spring.cloud.nacos.config.groupdev_group
spring.cloud.nacos.config.namespacea183d481-0715-48c3-a788-eab71b1e73fd
*****************************************************************************************
# 开发环境
spring.profiles.activedev
#spring.profiles.activetesthttp://localhost:3377/client3377_info
返回from nacos self namespace self group self client3377-dev.properties
*****************************************************************************************
自己的配置虽然可以知道更多的知识但是感觉使用的时候不太方便那么我们就用默认的也挺好的
但是阳哥说了需要掌握我就用自己配置的吧
【11】106集 Nacos集群与持久化配置 架构说明。先说集群
nacos.com----vip虚拟IP nginx----nacos1Nacos2Nacos3
*****************************************************************************************
nacos自带了一个内嵌的数据库derby。
nacos采用了集中式存储的方式来支持集群化部署目前支持mysql的存储。
*****************************************************************************************
nacos支持3中部署模式单击模式、集群模式、多集群模式
*****************************************************************************************
不用单击模式内嵌的数据库了。用集群配置统一的外部mysql持久化存储这是接下来讲的重点
【12】107 Nacos持久化切换配置
****************************************************************************************************************************************************************************
18、Nacos
【1】服务注册与配置中心EurekaGit...
Naming和Configuration的前两个字母最后s为service
*****************************************************************************************
动态的服务发现、配置管理和服务管理平台就是注册中心配置中心
NacosEurekaConfigBus
*****************************************************************************************
https://github.com/alibaba/Nacos
【2】安装运行Nacos
链接https://pan.baidu.com/s/1y2r9bl7sexqlk0mPLN12Ow
提取码rwck
到bin目录starup打开改写java bin路径
if not exist C:\IT\JDK1.8\bin\java.exe echo Please set the JAVA_HOME variable in your environment, We need java(x64)! jdk8 or later is better! EXIT /B 1
set JAVAC:\IT\JDK1.8\bin\java.exe
*****************************************************************************************
启动startup.cmd -m standalone
http://localhost:8848/nacos 访问看到界面
【3】服务提供者注册server
服务列表能看到alibaba-server9001说明注册成功
再建立个9002服务提供者server9002
【4】99集 消费者client注册和负载
建立两个名字统一为alibaba-server90019002 // 不能有特殊字符 注意哈
*****************************************************************************************
http://localhost/client/nacos/19
来自nacos注册中心端口号9001 id是19
来自nacos注册中心端口号9002 id是19
*****************************************************************************************
server90019002client80都成功注册进了nacos
【5】100集 服务中心的对比
Nacos可以切换CP AP模式。
性感荷官在线发牌姿势可以切换。
【6】101集 Nacos服务配置中心
这一章非常重要
*****************************************************************************************
一定要先粘贴pom不然application.properties都不能是被为绿叶子
RefreshScope // 保持nacos动态刷新
*****************************************************************************************
Nacos的配置规则
spring.application.nameclient3377
spring.profiles.activedev
*****************************************************************************************
client3377-dev.properties 对应的nacos就要配置对应的文件名
*****************************************************************************************
所以本地配置拉取和nacos是一一对应的spring.application.name-spring.profiles.active.properties
*****************************************************************************************
config.infofrom nacos by wdfgdzx
*****************************************************************************************
http://localhost:3377/client3377_info
from nacos by wdfgdzx
*****************************************************************************************
卧槽好方便那我以后用nacos配置开发了沃日哦
【7】102 Nacos命名空间、分组、DataID三者之间的关系
配置多了怎么管理
*****************************************************************************************
namespace是可以区分部署环境的。Group和dataID逻辑上区分目标对象。
默认情况
namespacepublic
GroupDEFAULT_GROUP
ClusterDEFAULT
*****************************************************************************************
不同的namespace之间是隔离的
Group可以把不同的微服务划分到一个组解决订单重复消费问题
*****************************************************************************************
Service就是微服务 HZ杭州 GZ 广州
【8】103集 Nacos配置Data ID
更改application.properties的修改test后自动从nacos的client3377-test.properties读取内容
spring.profiles.activetest
http://localhost:3377/client3377_info
返回test from nacos
*****************************************************************************************
讲道理项目小的话DEFAULT_GROUP都够用的但是吧这是微服务项目肯定不太小.....
【9】Nacos配置之Group分组方案
dev_group
*****************************************************************************************
spring.cloud.nacos.config.groupdev_group
spring.profiles.activeinfo
http://localhost:3377/client3377_info
返回from nacos dev_group info
【10】Nacos配置之namespance这个是最大的区分
*****************************************************************************************
# 这个优先级最高所以nacos配置要放到这个文件里
server.port3377
spring.application.nameclient3377
spring.cloud.nacos.discovery.server-addrlocalhost:8848
# 读取配置文件
spring.cloud.nacos.config.server-addrlocalhost:8848
spring.cloud.nacos.config.file-extensionproperties
spring.cloud.nacos.config.groupdev_group
spring.cloud.nacos.config.namespacea183d481-0715-48c3-a788-eab71b1e73fd
*****************************************************************************************
# 开发环境
spring.profiles.activedev
#spring.profiles.activetesthttp://localhost:3377/client3377_info
返回from nacos self namespace self group self client3377-dev.properties
*****************************************************************************************
自己的配置虽然可以知道更多的知识但是感觉使用的时候不太方便那么我们就用默认的也挺好的
但是阳哥说了需要掌握我就用自己配置的吧
【11】106集 Nacos集群与持久化配置 架构说明。先说集群
nacos.com----vip虚拟IP nginx也可以配置集群----nacos1Nacos2Nacos3
*****************************************************************************************
nacos自带了一个内嵌的数据库derby。
nacos采用了集中式存储的方式来支持集群化部署目前支持mysql的存储。
*****************************************************************************************
nacos支持3中部署模式单击模式、集群模式、多集群模式
*****************************************************************************************
不用单击模式内嵌的数据库了。用集群配置统一的外部mysql持久化存储这是接下来讲的重点
【12】107 Nacos持久化切换配置
目前仅支持mysql存储
*****************************************************************************************
切换数据库
在C:\IT\Nacos\nacos\conf\mysql-schema.sql
把这个内容放到mysql数据库执行下会自动创建表库名nacos_config
*****************************************************************************************
在C:\IT\Nacos\nacos\conf\application.properties最下方增加如下内容连接数据库
spring.datasource.platformmysql
db.num1
db.url.0jdbc:mysql://localhost:3306/nacos_config?characterEncodingutf8connectTimeout1000socketTimeout3000autoReconnecttrue
db.user.0root
db.password.0123456
*****************************************************************************************
startup.cmd -m standalone 重启nacos再访问就是全新的
*****************************************************************************************
而且在nacos里里面配置的内容在mysql的config_info就能看到了
【13】108 Linux版NacosMysql生产环境配置
预计需要1个Nginx夏磊老师3个Nacos注册中心1个Mysql
*****************************************************************************************
3个或3个以上的Nacos才能构成集群卧槽牛批
*****************************************************************************************
安装配置nacos Linux版本
mkdir myNacos
cd /opt/myNacos
把nacos-server-1.4.3.tar.gz传上去
tar -zxvf nacos-server-1.4.3.tar.gz
cd /opt/myNacos/nacos/
下面的文件和windows就很类似了
【14】109 Nacos集群配置上
Nginx访问报错不一定是Nginx有问题可能是配置的服务没有启动
*****************************************************************************************
修改Linux里面的nacos脚本命令。
startup -p 3333
*****************************************************************************************
跟着阳哥学规范所有的Linux配置在/opt下面 my大写字母xxxx方便区分.....
nacos-mysql.sql 搞到本地Linux对应的数据库里11张表一共
*****************************************************************************************
cp application.properties application.properties.bak
备份配置文件
*****************************************************************************************
配置数据库 cd /opt/myNacos/nacos/conf/
vim application.properties
spring.datasource.platformmysql
db.num1
db.url.0jdbc:mysql://192.168.0.205:3306/nacos_config?characterEncodingutf8connectTimeout1000socketTimeout3000autoReconnecttrue
db.user.0root
db.password.0
*****************************************************************************************
cp cluster.conf.example cluster.conf
vim cluster.conf
只保留如下内容其他注释
192.168.0.205:3333
192.168.0.205:4444
192.168.0.205:5555
*****************************************************************************************
编辑nacos的启动脚本startup.sh使它能够接受不通的启动端口
cd /opt/myNacos/nacos/bin
新版感觉就需要改一个地方-Dserver.port${PORT}
nohup $JAVA -Dserver.port${PORT} ${JAVA_OPT} nacos.nacos ${BASE_DIR}/logg 第二处
*****************************************************************************************
PORT$OPTARG;; 第一处
【15】110 Nacos配置Nginx下
cd /usr/local/nginx/conf
vim nginx.conf
*****************************************************************************************
# 配置负载均衡upstream wdfgdzx{ // 第二步# 服务器资源server 192.168.0.205:3333 weight3;server 192.168.0.205:4444 weight4;server 192.168.0.205:5555 weight5;}server {listen 1111; // 第一步server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;location / { // 第三步# root html; # index index.html index.htm;proxy_pass http://wdfgdzx;}
*****************************************************************************************
cd /usr/local/nginx/sbin
./nginx
netstat -lnp|grep 1111
可以看到nginx启动成功了
*****************************************************************************************
cd /opt/myNacos/nacos/bin/
./startup.sh -p 3333
./startup.sh -p 4444
./startup.sh -p 5555
*****************************************************************************************
注意虚拟机的内存要搞到8G不然2G的都启动不起来卧槽好坑呀学架构没有大内存能行吗我的哥
ps -ef|grep nacos|grep -v grep|wc -l 能看到3个都正常了
大功告成
*****************************************************************************************
访问发现失败了需要关闭Linux本地的防火墙
systemctl disable firewalld
systemctl stop firewalld
*****************************************************************************************
http://192.168.0.205:1111/nacos
访问就可以看到nacos配置下测试文件many.properties就能看到数据库的数据变化了说明生效了。
*****************************************************************************************
server.port9002
spring.application.namealibaba-server90019002
# nacos 后面监控的暴露 服务器的Nginx地址
spring.cloud.nacos.discovery.server-addr192.168.0.205:1111
management.endpoints.web.exposure.include*
*****************************************************************************************
alibaba-server90019002注册进了nacos 注意是通过nginx转发注册的哦
牛批牛批牛批牛批牛批牛批牛批牛批牛批牛批牛批牛批牛批牛批牛批牛批牛批牛批牛批牛批
****************************************************************************************************************************************************************************
19、Sentinel spinrg cloud alibaba
【1】概念
可以监控保护你的微服务分布式系统的流量防伪兵就是豪猪哥的阿里版
**************************************************************************************
但是豪猪哥没有一套web界面可以给我们进行细粒度化的配置
没有流控、速率控制、服务熔断、服务降级...
**************************************************************************************
Sentinel应用而生
1、单独一个组件可以独立出来。
2、支持界面化的细粒度统一配置。
约定配置编码
大规模的使用配置和使用注解方式尽量少写代码。
【2】Sentinel的下载安装运行
https://github.com/alibaba/Sentinel/releases?page1
**************************************************************************************
后台前台8080
核心库JAVA客户端不依赖任何框架/库只要有JAVA环境即可
控制台用springboot开发的打包后运行jar就行了
**************************************************************************************
java -jar sentinel-dashboard-1.8.6.jar
http://localhost:8080/#/login
sentinel sentinel 账户密码都是这个
【3】113 Sentinel初始化监控
配置项目sentinel-server8001后启动它
**************************************************************************************
由于用到了懒加载机制需要访问Controller里的方法才能看到监控情况。
http://localhost:8001/test_a
http://localhost:8001/test_b
**************************************************************************************
http://192.168.0.105:8080/#/dashboard/home 访问就能看到8001
**************************************************************************************
顺便解决了微服务打包的问题至此微服务打包问题解决sentinel-server8001-1.0-SNAPSHOT
看父工程子工程的build maven配置
**************************************************************************************
地址突然从192.168.0.105变为了192.168.0.106卧槽坑爹局域网重连接
解决局域网的IP地址冲突问题windows下的IP地址被重新分配导致虚拟机Linux无法连接。注意地址后三位不能大于255
所以虚拟机IP尽量不要用192.168.0.10x 而是用11x直接用192.168.0.20x吧
**************************************************************************************
查看当前主机别名并做修改识别重点是修改为主机IP方便记忆
[root192 ~]# hostname
192.168.222.131
//修改主机别名为work3
[root192 ~]# hostnamectl set-hostname 192-168-0-105 // 不能用·会显示不全
//重启服务器
[root192 ~]# reboot
**************************************************************************************
工欲善其事必先利其器磨刀不误砍柴工
导致我nginx配置的负载均衡地址也需要跟着变化....
nacos的数据库地址配置变化....
xxx.properties要变.... cluster.conf
**************************************************************************************
有时候还是要找到根源重新加载centos也是无济于事的.....最好是避免事情的发生我日尼玛
**************************************************************************************
连着项目的application.properties也要跟着变
server.port8001
spring.application.namesentinel-server8001
# 注册到Linux的nacos集群
spring.cloud.nacos.discovery.server-addr192.168.0.205:1111
spring.cloud.sentinel.transport.dashboard192.168.0.205:8080
#默认是8719 假如被占用则自动1开始扫描直到找到未占用的端口
spring.cloud.sentinel.transport.port8719
management.endpoints.web.exposure.include*
**************************************************************************************
终于大功告成不负所托
**************************************************************************************
另外n1个坑
第二种是版本不一样。直接吧nacos整个目录复制两份TMD 尽信书不如无书
**************************************************************************************
cd /opt/myNacos
cp -r nacos1/ nacos2/
cp -r nacos1/ nacos3/
**************************************************************************************
cd /opt/myNacos/nacos1/bin/
./startup.sh -p 3333
**************************************************************************************
cd /opt/myNacos/nacos2/bin/
./startup.sh -p 4444
**************************************************************************************
cd /opt/myNacos/nacos3/bin/
./startup.sh -p 5555
**************************************************************************************
确实可以搭建成功集群但是也没必要这么多浪费了不是
可以不用但是不能不会牛批
【4】114 Sentine流控规则概述
流控规则基本介绍....
【5】流控之QPS----直接失败
在簇点链路---/test_a---流控 QPS超过1直接失败。
在流控规则可以看到新增的这个规则
http://192.168.0.205:8001/test_a 访问他只能1S1次如果快速点击会报错
Blocked by Sentinel (flow limiting) 这就是直接快速失败
而且在规则哪里的配置是实时生效的
【6】流控---线程数直接失败
线程数只有1个业务人员
业务能进来但是只能处理第一个人的业务。
Thread.sleep(1000);就能看出来
拒敌于国门之外关门打狗两种模式
【7】流控模式----关联
当关联的资源达到阈值后就限流自己
B惹事A挂了
用postman 访问test_b 20个并发 300ms一次
访问test_a直接就拉闸限流了牛批
【8】流控模式----链路/流控效果
多个请求调用了同一个微服务
*****************************************************************************************
快速失败
Blocked by Sentinel (flow limiting)
*****************************************************************************************
预热WarmUp
当系统平时访问不多突然增加了
一开始是10/3 等到5ms后 才变成10
可以应用于秒杀系统
【9】流控模式----排队等待
配置成排队等待后很多请求就回转圈等待了
【10】120 Sentinel降级熔断降级
慢调用比例 平均响应时间
异常比例数异常比例达到多少
异常数异常数达到多少
*****************************************************************************************
当熔断后这段窗口期使用不了对该资源正常后才能正常使用的。
Sentinel熔断要么能用要么不能用。就这两种状态。
【11】熔断----慢调用比例
例如1s内进入5个请求对应时刻的平均响应时间超过阈值以ms为单位熔断---那么接下来的
窗口期对这个方法的调用自动熔断。窗口期结束慢慢的恢复。
http://192.168.0.205:8001/test_d 当批量请求没达到200ms处理的时候
访问http://192.168.0.205:8001/test_d 就报错
Blocked by Sentinel (flow limiting) 66666666666666666
*****************************************************************************************
又get了新技能postman也能批量测试牛批
【12】熔断----异常比例/异常数
当资源近一分钟异常数达到阈值后熔断。
http://192.168.0.205:8001/test_d
Blocked by Sentinel (flow limiting)
【13】热点规则---key上集说明
热点限流就是根据传进来的参数进行限流
从给的默认提示Blocked by Sentinel 改变成和豪猪哥一样的限流提示。
从豪猪哥到SentinelResourceHystrixCommand
GetMapping(/test_key)
SentinelResource(value test_key, blockHandler test_key_deal)
public String test_key(RequestParam(value p1, required false) String p1, RequestParam(value p2, required false) String p2) {return ----test_key;
}public String test_key_deal(String p1, String p2, BlockException blockException) {return ----test_key---exception---自定义的返回处理方法---;
}
*****************************************************************************************
配置热点 第0个下标的参数的时候
http://192.168.0.205:8001/test_key?p11 稍微频繁刷新
则返回----test_key---exception---自定义的返回处理方法---
如果不配置则直接就是报错页面了。对用户不友好这个确实挺实用的
【14】热点规则---key下集说明125集---参数列外项
p1的值不同限流不同.....卧槽好屌做会员呢 VIP呢
http://192.168.0.205:8001/test_key?p13
刷刷就返回----test_key---exception---自定义的返回处理方法---
http://192.168.0.205:8001/test_key?p15
刷刷刷还是正常的----test_key
因为加了例外值 5 java.lang.String 200限流达到200了
*****************************************************************************************
但是如果代理里有异常sentinel配置规则是不管的哦注意哈【15】系统规则总控用的不是那么多。通用的外围规则配置Load自适应CUP usage平均 RT并发线程数入口QPS 1所有的方法只要频繁访问就会报错Blocked by Sentinel (flow limiting)
【16】127 SentinelResoure配置上
http://192.168.0.205:8001/by_resource
{code:200,message:按资源名称限流测试成功,object:{id:2023,serial:serial001}}
*****************************************************************************************
配置规则后然后点击快速点
http://192.168.0.205:8001/by_resource
{code:500,message:com.alibaba.csp.sentinel.slots.block.flow.FlowException-----
服务不可用,object:null}
*****************************************************************************************
如果服务8001关闭了流控规则什么都没有了说明是临时的。。。。。
*****************************************************************************************
报错的返回信息如果自定义了就用自定义的如果没有自定义就用默认的~~~~~~~~
【17】127 SentinelResoure配置中----全局配置处理方法结果-----
package com.day.handler;import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.day.pojo.Constants;
import com.day.pojo.Payment;
import com.day.pojo.Res;public class CustomerBlockHandler {public Res by_resource_deal(BlockException blockException) {return new Res(Constants.CODE_500, blockException.getClass().getCanonicalName() -----服务不可用----1, serial001);}public static Res customer_block_deal(BlockException blockException) {return new Res(Constants.CODE_500, 按客户自定义全局的方法----2, new Payment(2023L, serial002));}
}
*****************************************************************************************
GetMapping(/customer_block)SentinelResource(value customer_block,blockHandlerClass CustomerBlockHandler.class, blockHandler customer_block_deal)public Res customer_block_handler() {return new Res(Constants.CODE_200, 按客户自定义测试成功, new Payment(2023L, serial003));}
*****************************************************************************************
http://192.168.0.205:8001/customer_block
刷快点就触发了
{code:500,message:按客户自定义全局的方法----2,object:{id:2023,serial:serial002}}
CustomerBlockHandler.customer_block_deal
【18】SentinelResoure配置下----
Controller------自定义配置的类------Sentinel界面即可使用
*****************************************************************************************
还支持代码形式的编写不推荐。约定配置代码.....
【19】130集 Sentinel服务熔断Ribbon环境预说
Sentinel整合ribbonopenFeignfallback
*****************************************************************************************
中间插入下配置下Linux服务自启动相关的东西
start-nacos.sh start-nginx.sh start-sentinel.sh
vim /etc/rc.d/rc.local
********************************
# 开机自动启动 执行指定的sh文件
/opt/myAutoStart/start-nginx.sh
/opt/myAutoStart/start-nacos.sh
/opt/myAutoStart/start-sentinel.sh
************************************
每次开机后只需要执行一下source /etc/rc.d/rc.local
佩服自己吧我的哥哥哥牛批了
在本地本机虚拟机上非常实用
*****************************************************************************************
重点是Client84Controller里的内容
【20】131 Sentinel服务熔断无配置
又要打包了就因为我尽量往Linux系统上靠了
*****************************************************************************************
!--父pom就是打jar包的作用--buildpluginspluginartifactIdmaven-surefire-plugin/artifactId!-- 打包跳过单元测试 --configurationskipTeststrue/skipTeststestFailureIgnoretrue/testFailureIgnore/configuration/pluginpluginartifactIdmaven-compiler-plugin/artifactIdconfigurationsource1.8/sourcetarget1.8/targetencodingutf-8/encoding/configuration/plugin/plugins/build
*****************************************************************************************
build!-- 子pom打出来的jar包名 --pluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdversion2.4.2/versionconfiguration!-- 主启动类全类名 --mainClasscom.day.xxxxx 这个名字注意改/mainClass/configurationexecutionsexecutiongoals!--可以把依赖的包都打包到生成的Jar包中--goalrepackage/goal/goals/execution/executions/plugin/plugins/build
*****************************************************************************************
http://192.168.0.205:84/client_fallback/4
Sun May 07 21:38:48 CST 2023
There was an unexpected error (typeInternal Server Error, status500).
IllegalArgumentException,非法参数异常
*****************************************************************************************
http://192.168.0.205:84/client_fallback/5
对比下返回结果肯定是有处理的舒服点看着
{code:500,message:兜底异常handlerexception内容NullPointerException,该ID没有记录
空指针异常,object:{id:5,serial:null}}
【21】只配置blockHandlerfallback和blockHandler都配置
我个人感觉处理好限流就行了异常就异常呗不就是页面不好看点吗为什么要出现异常呢
不应该从代码层面处理吗
大佬说的对处理好Sentinel限流就行了
exceptionsToIgnore {IllegalArgumentException.class} 忽略属性
其实也是响应了我的价值为什么要出现异常呢不应该从代码层面处理吗 哈哈哈 笑死了
*****************************************************************************************
alibaba sentinel 是非常优秀的框架
【22】Sentinel服务熔断OpenFeign
Fegin组件一般是消费者client84端
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId
/dependency
*****************************************************************************************
#开启对feign的支持
feign.sentinel.enabledtrue
*****************************************************************************************
EnableFeignClients
public class Client84 {public static void main(String[] args) {SpringApplication.run(Client84.class, args);}
}
*****************************************************************************************
FeignClient(value server90039004, fallback PaymentFallbackService.class)
public interface PaymentService {GetMapping(/server/{id}) // 这里是调用服务侧的public Res client(PathVariable(id) Long id);
}
*****************************************************************************************
控制类里调用
Resource
private PaymentService paymentService;GetMapping(/client/{id})
public Res client(PathVariable(id) Long id) {return paymentService.server(id); // 调用服务侧的
}
*****************************************************************************************
http://192.168.0.205:84/client/1
{code:200,message:from mysql ,serverPort: 9003,object:{id:1,serial:
28adsasadsafas5d1as5fad5as31d3as0}}
{code:200,message:from mysql ,serverPort: 9004,object:{id:1,serial:
28adsasadsafas5d1as5fad5as31d3as0}}
*****************************************************************************************
说明
Resource
private RestTemplate restTemplate;
Resource
private PaymentService paymentService;
都可以实现微服务的轮询调用
【23】Sentinel 规则的持久化配置
流控规则的消失的问题解决
*****************************************************************************************
一旦重启应用说的不是Sentinel哈是服务或者消费端应用Sentinel配置规则就消失了。
将限流规则持久化配置进nacos保存只要刷新1111某个rest地址sentinel控制台的流控规则就能看到。
只要nacos里面的配置不删除针对1111上的流控规则配置持久有效。
*****************************************************************************************
比如重启了84服务原来的限流规则就不生效了...........
*****************************************************************************************
解决方法
!-- sentinel-datasource-nacos 后续持久化用 --
dependencygroupIdcom.alibaba.csp/groupIdartifactIdsentinel-datasource-nacos/artifactId
/dependency
*****************************************************************************************
# 持久化数据库配置
spring.cloud.sentinel.datasource.ds1.nacos.server-addr192.168.0.205:1111
spring.cloud.sentinel.datasource.ds1.nacos.data-id${spring.application.name}
spring.cloud.sentinel.datasource.ds1.nacos.group-idDEFAULT_GROUP
spring.cloud.sentinel.datasource.ds1.nacos.data-typejson
spring.cloud.sentinel.datasource.ds1.nacos.rule-typeflow
*****************************************************************************************
// 预先在nacos里设置的规则
[{resource:/client/1,limitApp:default,grade:1,count:1,strategy:0,controlBehavior:0,clusterMode:false}
]
*****************************************************************************************
http://192.168.0.205:84/client/1
启动的时候访问规则配置地址在sentinel就能看到预先设置的规则
*****************************************************************************************
计算84重启了只要再次访问http://192.168.0.205:84/client/1
规则就会自动从nacos读取了。
****************************************************************************************************************************************************************************
20、Seata
【1】138集 分布式事务问题由来 0分钟
硅谷学子不弱于人。
*******************************************************************************
分布式前单击单库没有这个问题....
1 V 1
*******************************************************************************
1 V N 一个程序多个数据库
*******************************************************************************
多个程序多个库 N V N
RPC调用
每个服务的数据一致性都只能有本地保证那么全局的数据一致性问题就需要有个全局数据一致性保障
【2】Seata应用而生
分布式事务处理过程的ID三组件模型
全局事务ID3组件概念
TC 事务协调者
TM 事务管理器
RM 资源管理器就是数据库
XID
*******************************************************************************
TM向TC申请开启一个全局事务并生成XID 班主任向授课老师申请开班并建立一个直播群xxx1
XID在微服务调用链路上上下文中传播传播直播群xxx1消息给同学
RT向TC注册分支事务纳入XID对应全局事务管辖同学注册账号加入直播群
TM向TC发起针对XID的全局提交建议或回滚决议讲课多少时间全部都能看到
TC调度XID下管辖的全部分支事务完成提交或者回滚请求正式结课。
【3】三板斧理论 实操 小总结~~~~
seata搭建难使用简单....
链接https://pan.baidu.com/s/1uPpMoqL66wbknvCGcnLJkA
提取码99bd
*******************************************************************************
cd /opt/mySeata/seata/conf
*******************************************************************************
修改
vgroup_mapping.my_test_tx_group fsp_tx_group
*******************************************************************************store {56 ## store mode: file、db57 mode db
*******************************************************************************
url jdbc:mysql://192.168.0.205:3306/seata
user root
password
*******************************************************************************
自己建库
db_store.sql 粘贴到库执行命令自动生成3张表
*******************************************************************************
cp registry.conf registry.conf.bak
vim registry.conf
*******************************************************************************
修改
type nacos
nacos {
serverAddr 192.168.0.205:1111 // 地址
namespace
cluster default
}
*******************************************************************************
启动
cd /opt/mySeata/seata/bin
./seata-server.sh 注意一定先启动nacos 再启动seata
报错 Error: JAVA_HOME is not defined correctly.
vim /etc/profile 检查发下路径版本真的错误了还是要细心呀
修改后source /etc/profile 再次执行即可
【4】141 业务数据库准备
勿在浮沙筑高台
订单服务库存服务账户服务
*******************************************************************************
下订单----扣库存----减账户余额
*******************************************************************************
创建三个库---三个表
每个库再执行/opt/mySeata/seata/conf/db_undo_log.sql的回滚日志库
【5】142 Module配置搭建
Maven有时候找不到可能是本地配置问题注释掉其他引入单独引入看下
水到渠成心急吃不了热豆腐改怎么样还是要怎么样的
!-- dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactId/dependency--
这个会影响项目的正常引包配置文件的识别需要注释掉
*******************************************************************************
为了加快进度我就复制代码了.... 哈哈哈哈基本配置需要改下
url jdbc:mysql://192.168.0.205:3306/seata
user root
password
*******************************************************************************
registry {# file 、nacos 、eureka、redis、zk、consul、etcd3、sofatype nacosnacos {#serverAddr localhostserverAddr 192.168.0.205:1111namespace cluster default}
【6】跟着过写代码
DAO的两个接口
*******************************************************************************
学以致用没事还是用用nacos的配置这样才能熟悉呢~可惜我的机器内存太小emmm
*******************************************************************************
写Service要是我直接写在Controller用Mapper操作嘿嘿嘿
【7】写代码下 144集
FeignClient(value seata-account-service)
*******************************************************************************
OrderController
【8】2002Module说明
主要是resources下面的配置更改参考【5】的更改
【9】Account Module说明
主要是resources下面的配置更改参考【5】的更改
【10】GlobalTransaction验证 147集0分钟
http://localhost:2001/order/create?userId1productId1count10money100
{code:200,message:订单创建成功,data:null}
草拟马 突然就好了浪费我好久时间
看来真的是不能心急时机未到想成事太难人为了不可强求
*******************************************************************************
网上找的代码有时候写的真坑浪费阅读者的时间简直是
*******************************************************************************
package com.atguigu.springcloud.alibaba.service.impl;import com.atguigu.springcloud.alibaba.dao.AccountDao;
import com.atguigu.springcloud.alibaba.service.AccountService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.math.BigDecimal;/*** author wsk* date 2020/3/25 22:10*/
Service
public class AccountServiceImpl implements AccountService {private static final Logger LOGGER LoggerFactory.getLogger(AccountServiceImpl.class);ResourceAccountDao accountDao;/*** 扣减账户余额*/Overridepublic void decrease(Long userId, BigDecimal money) {LOGGER.info(-------account-service中扣减账户余额开始);// 模拟超市异常全局事务回滚 超市20stry {Thread.sleep(20000);} catch (Exception e) {e.printStackTrace();}accountDao.decrease(userId, money);LOGGER.info(-------account-service中扣减账户余额结束);}
}
*******************************************************************************
Read timed out executing POST http://seata-account-service/account/decrease?userId1money100
故障情况订单状态异常后账号金额库存照扣了
由于feign的重试机制账号余额可能被多次扣减
*******************************************************************************
public class OrderServiceImpl implements OrderService {
Resource
private OrderDao orderDao;Resource
private StorageService storageService;Resource
private AccountService accountService;/*** 创建订单-调用库存服务扣减库存-调用账户服务扣减账户余额-修改订单状态* 简单说* 下订单-减库存-减余额-改状态*/
Override
GlobalTransactional(name fsp_create_order, rollbackFor Exception.class)
// 这个是解决问题的根本关键
*******************************************************************************
重启2001
会发现订单无效的根本没有插入牛批我的哥哥
【11】Seata之原理概述 148集
蚂蚁金服和阿里巴巴
*******************************************************************************
1.0.0-GA以上
TC seata服务器
TM GlobalTransactional 就是事务的发起者
RM 事务参与方
*******************************************************************************
AT模式----阿里云GTS
*******************************************************************************
一阶段前置镜像before image-----干活-----后置镜像 after image----生成行锁
二阶段提交就是提交。如果需要回滚需要回滚第一阶段执行的“业务SQL”还原业务数据。
中间还需要考虑是否出现别人操作脏写的情况发生。
branch_table 下面会有branch_id xid
*******************************************************************************
用json记录的修改前后的记录
transaction id 每一个业务流水凭证
*******************************************************************************
debug才能看到数据处理完毕数据都是清空的事了拂衣去深藏功与名
【12】149 大厂面试之雪花算法上
保证唯一全局ID的生成
唯一性递增趋势、单调递增、信息安全ID无规则、含时间戳
高可用、低延迟、高QPS
答雪花算法。
System.out.println(UUID.randomUUID().toString);可以参考但不能用
*******************************************************************************
mysql唯一性递增
*******************************************************************************
基于Redis生成全局id策略又TM得学Redis了emmm
Redis集群----中小厂都可以落地了但是需要额外的技术和人力成本
【13】150 大厂面试之雪花算法下
走到终极snowflake 雪花算法
*******************************************************************************
推特twitter 26万个自增可排序的ID/秒 可产生
雪花算法生成的ID是long来存储的。
一个机房可以部署32台机器每台机器每秒可以产生4095个ID序号
*******************************************************************************
我感觉还是先研究nginx集群服务集群mysql主从复制就够用了对于我能接触的项目来说
*******************************************************************************
正常可以用到2039年以后...
*******************************************************************************
有java版的雪花算法的
*******************************************************************************
hutool工具包小而全的工具类库。
springboot整合雪花算法
github.com/looly/hutool/
*******************************************************************************
hutool-all
*******************************************************************************
百度的UidGenerator
美团的Leaf 美团点评的分布式ID生成系统
*******************************************************************************
跟着阳哥打完收工