SPRING-CLOUD从入门到精通

第一章=>
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个核心问题
服务很多,客户端该怎么访问?
****************************************************************************************
这么多服务,服务与服务之间如何通讯?
****************************************************************************************
这么多服务,怎么管理? 注册中心、服务发现
****************************************************************************************
这么多服务,服务挂了怎么办?
****************************************************************************************
SpringCloud+SpringCloud alibaba
****************************************************************************************
JAVA8+Maven+Git+Nginx+RMQ+SpringBoot
****************************************************************************************
持续学习+专注+专业
【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 version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false"><contextName>logback</contextName><!--输出到控制台--><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><!--按天生成日志,即一天只生成一个文件夹和一个日志文件--><appender name="logFile" class="ch.qos.logback.core.rolling.RollingFileAppender"><Prudent>true</Prudent><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><FileNamePattern>applog/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}.log</FileNamePattern></rollingPolicy><layout class="ch.qos.logback.classic.PatternLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss} -%msg%n</Pattern></layout></appender><!-- logger节点,可选节点,作用是指明具体的包或类的日志输出级别,以及要使用的<appender>(可以把<appender>理解为一个日志模板)。addtivity:非必写属性,是否向上级loger传递打印信息。默认是true--><logger name="com.framework.job" additivity="false"><appender-ref ref="console"/><appender-ref ref="logFile"/></logger><!--项目的整体的日志打印级别为info--><root level="info"><appender-ref ref="console"/><appender-ref ref="logFile"/></root></configuration>
@#日志级别
logging.level.com.framework.job=info
*********************************************************************************************
@完事万物需要简单化
@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包-->
<dependency><groupId>org.example</groupId><artifactId>common</artifactId><version>${project.version}</version>
</dependency>

****************************************************************************************************************************************************************************

5、Eureka服务注册与发现
零基础-初级-中级-高级
【1】注册中心-Eureka基础
@服务治理:调用、均衡....
@Eureka集群、服务提供集群,避免单点故障
@Eureka连接着客户端与服务端
【2】单机版Eureka
***********************************************************************************单机版Eureka
@端口7001,建立module
<!--eureka server-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--引入自己定义的api通用包,可以使用payment支付Entity-->
<dependency><groupId>org.example</groupId><artifactId>common</artifactId><version>${project.version}</version>
</dependency>
***********************************************************************************
@application.properties
server.port=7001
#服务端实例名称
eureka.instance.hostname=localhost
#false表示不向注册中心注册自己
eureka.client.register-with-eureka=false
#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
eureka.client.fetch-registry=false
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
eureka.client.service-url.defaultZone=http://${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.port=90
spring.application.name=cloud-order-service
#eureka
#表示是否将自己注册进EurekaServer 默认为true
eureka.client.register-with-eureka=true
#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
eureka.client.fetch-registry=true
eureka.client.service-url.defaultZone=http://localhost:7001/eureka
【3】集群版Eureka
实现负载均衡和故障容错
***********************************************************************************
互相注册,相互守望
@7001 --7002互相指向
***********************************************************************************
127.0.0.1       eureka7001.com
127.0.0.1       eureka7002.com
***********************************************************************************
server.port=7001
#服务端实例名称
eureka.instance.hostname=eureka7001.com
#false表示不向注册中心注册自己
eureka.client.register-with-eureka=false
#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
eureka.client.fetch-registry=false
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
eureka.client.service-url.defaultZone=http://eureka7002.com:7002/eureka/
***********************************************************************************
server.port=7002
#服务端实例名称
eureka.instance.hostname=eureka7002.com
#false表示不向注册中心注册自己
eureka.client.register-with-eureka=false
#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
eureka.client.fetch-registry=false
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
eureka.client.service-url.defaultZone=http://eureka7001.com:7001/eureka/
***********************************************************************************
@7001指向7002,7002指向7001
DS Replicas
eureka7002.comDS Replicas
eureka7001.com
***********************************************************************************
eureka.client.service-url.defaultZone=http://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 {@Bean@LoadBalancedpublic 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-id=payment9001
eureka.instance.prefer-ip-address=true
@实现重命名+机器IP地址显示
【6】服务发现Discovery
对于注册进eureka里面的微服务,通过服务发现来获取该服务的信息。
@EnableEurekaClient
@EnableDiscoveryClient
***********************************************************************************
作用:每一个服务都能拿到其他服务的信息!!!!!!!!!!!!!!!!!!!!!!
【7】Eureka自我保护机制
含义:当某一时刻某个微服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存。
***********************************************************************************
默认情况下,EurekaServer在一段时间某个微服务示例的心跳,默认90秒。
设计哲学:宁可保留错误的注册信息,也不注销任何可能将康的实例。
【8】怎么禁止自我保护,加深下认知而已。听下就行了!!!反正最后也不会用这个
【9】Eureka停更说明
停更不停用。但是技术是在不断发展的,还是需要学习新技术。

****************************************************************************************************************************************************************************

6、Zookeeper
【1】注册中心Zookeeper
@关闭Linux服务器防火墙后(不用操作),启动zookeeper服务器(开启端口访问是一样的...)
@zk取代Eureka,zk作为服务注册中心
<!--springboot整合zookeeper客户端--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zookeeper-discovery</artifactId><!--先排除自带的zookeeper3.5.3--><exclusions><exclusion> <!--避免jar包冲突--><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId></exclusion></exclusions></dependency><!--添加zookeeper3.4.14版本--><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.14</version><exclusions><exclusion><groupId>log4j</groupId><artifactId>log4j</artifactId></exclusion><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion></exclusions></dependency>
*************************************************************************************
server.port=9004   支付服务注册进zookeeper
spring.application.name=cloud-provider-payment
# 配置zookeeper  机器IP+端口号, 这里可以用域名 牛批,prettyzoo不能用端口号
spring.cloud.zookeeper.connect-string=wdfgdzx.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 {@Bean@LoadBalancedpublic 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.port=90
spring.application.name=cloud-consumer-order
# 配置zookeeper  机器IP+端口号, 这里可以用域名 牛批,prettyzoo不能用端口号
spring.cloud.zookeeper.connect-string=wdfgdzx.top:2181
*************************************************************************************访问
@ http://localhost:90/paymentInfo  调用成功  从90-----9004的服务
@zookeeper:9004 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.port=8006
spring.application.name=consul-provider-payment
#consul配置
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.service-name=${spring.application.name}
【4】服务消费者注册进consul
server.port=80
spring.application.name=consul-consumer-order
#consul配置
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
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 {@Bean@LoadBalancedpublic 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】手写一个负载的算法
原理+JUC(CAS+自旋锁的复习)---后面可以再学习下吧。

****************************************************************************************************************************************************************************

9、OpenFeign 43集
【1】OpenFeign与Feign是一回事
Feign可以与Eureka和Ribbon组合使用以支持负载均衡
***********************************************************************************
让Web服务器客户端变的非常日容易
***********************************************************************************
Ribbon+RestTemplate整合,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 (type=Internal Server Error, status=500).
status 404 reading PaymentFeignService#payment_timeout()
feign.FeignException$NotFound: status 404 reading PaymentFeignService#payment_timeout()
***********************************************************************************指定超时时间
server.port=80
eureka.client.register-with-eureka=false
eureka.client.service-url.defaultZone=http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka
ribbon.ReadTimeout=5000
ribbon.ConnectTimeout=5000
logging.level.com.day.service.PaymentFeignService=debug
***********************************************************************************
【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.PaymentFeignService=debug
***********************************************************************************
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: timeout=60
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.port=80
eureka.client.register-with-eureka=false
eureka.client.service-url.defaultZone=http://eureka7001.com:7001/eureka/
ribbon.ReadTimeout=10000
# feign.hystrix.enabled=true  // 豪猪哥还没用
******************************************************************************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 OK,80自己超时出故障,自己处理降级
【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 不能为负数,请稍后再试,id:12 (正的都报错了)
******************************************************************************不断刷才正常
后面慢慢的才正常
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.name=server,不要搞错了!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
server.port=9527
spring.application.name=gateway
eureka.instance.hostname=gateway-service
eureka.client.service-url.register-with-eureka=true
eureka.client.service-url.fetch-registry=true
eureka.client.service-url.defaultZone=http://eureka7001.com:7001/eureka
#配置网关  开启从注册中心动态创建路由工鞥呢,利用微服务名进行路由...
spring.cloud.gateway.discovery.locator.enabled=true
#没有固定规则,但是要求唯一
spring.cloud.gateway.routes[0].id=server_routh1
# lb://  服务提供方的名称,在8001端口的application.properties配置的
spring.cloud.gateway.routes[0].uri=lb://server
spring.cloud.gateway.routes[0].predicates[0]=Path=/server/get/**
#第二个
spring.cloud.gateway.routes[1].id=server_routh2
spring.cloud.gateway.routes[1].uri=lb://server
spring.cloud.gateway.routes[1].predicates[0]=Path=/server/lb/**
****************************************************************************************server.port=8001
spring.application.name=server
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.service-url.defaultZone=http://eureka7001.com:7001/eureka/
****************************************************************************************server.port=8002
spring.application.name=server
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.service-url.defaultZone=http://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].id=server_routh2
spring.cloud.gateway.routes[1].uri=lb://server
spring.cloud.gateway.routes[1].predicates[0]=Path=/server/lb/**
spring.cloud.gateway.routes[1].predicates[1]=After=2023-04-25T21:59:27.369+08:00[Asia/Shanghai]
****************************************************************************************
如果在After之前访问,会报错404
http://localhost:9527/server/lb
[ca137ffd] There was an unexpected error (type=Not Found, status=404).
****************************************************************************************
断言的作用就是加更多的条件。
****************************************************************************************
@JMeter/postman/curl
curl http://localhost:9527/server/lb(相当于postman的命令界面)
{"timestamp":"2023-04-25T13:58:59.306+0000","path":"/server/lb","status":404,"error":"Not Found","message":null,"requestId":"c44e52fd"}
****************************************************************************************
curl http://localhost:9527/server/lb --cookie "username=zzyy"
就会不断的返回8001 8002
C:\Users\Administrator>curl http://localhost:9527/server/lb --cookie "username=zzyy"
8002
C:\Users\Administrator>curl http://localhost:9527/server/lb --cookie "username=zzyy"
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 Mono<Void> 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?uname=zs
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.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
暴露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.group=wdfgdzx002
spring.cloud.stream.bindings.input.group=wdfgdzx003
*********************************************************************************************
而对应的RQM变成了如下的名称
Queue studyExchange.wdfgdzx002
Queue studyExchange.wdfgdzx003
*********************************************************************************************
那么都配置成
spring.cloud.stream.bindings.input.group=wdfgdzx
当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集 完成一个简单的调用
<artifactId>stream-rmq-server8801</artifactId><dependencies><!--包含了sleuth+zipkin--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId></dependency>
*************************************************************************************************
# 配置链路监控  # 1表示全部采集,正常使用0.5也可以
spring.zipkin.base-url=http://localhost:9411
spring.sleuth.sampler.probability=1
这就完成了调用记录的演示。

****************************************************************************************************************************************************************************

17、Alibaba 这才是最牛批的王道
【1】为什么需要Spring Cloud Alibaba?
因为spring cloud的很多技术都进入了停更、维护模块。
*****************************************************************************************
Dubbo阿里 ---SpringCloud(Netflix+2018)包一下
阿里巴巴:又包了上面的技术....(反包)!!!!!!!!!!!!!!
美团和阿里的兄弟们用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】服务注册与配置中心(Eureka+Git...)
Naming和Configuration的前两个字母,最后s为service
*****************************************************************************************
动态的服务发现、配置管理和服务管理平台,就是注册中心+配置中心
Nacos=Eureka+Config+Bus
*****************************************************************************************
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 "JAVA=C:\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
*****************************************************************************************
server90019002+client80都成功注册进了nacos!!!!!!!!!!!!!!!!!!!
【5】100集 服务中心的对比
Nacos可以切换CP AP模式。
性感荷官在线发牌,姿势可以切换。
【6】101集 Nacos服务配置中心
这一章非常重要
*****************************************************************************************
一定要先粘贴pom,不然application.properties都不能是被为绿叶子
@RefreshScope // 保持nacos动态刷新
*****************************************************************************************
Nacos的配置规则
spring.application.name=client3377
spring.profiles.active=dev
*****************************************************************************************
client3377-dev.properties  对应的nacos就要配置对应的文件名
*****************************************************************************************
所以本地配置拉取和nacos是一一对应的,spring.application.name-spring.profiles.active.properties
*****************************************************************************************
config.info=from nacos by wdfgdzx
*****************************************************************************************
http://localhost:3377/client3377_info
from nacos by wdfgdzx
*****************************************************************************************
卧槽好方便,那我以后用nacos配置开发了,沃日哦
【7】102 Nacos命名空间、分组、DataID三者之间的关系
配置多了怎么管理?
*****************************************************************************************
namespace是可以区分部署环境的。Group和dataID逻辑上区分目标对象。
默认情况
namespace:public
Group:DEFAULT_GROUP
Cluster:DEFAULT
*****************************************************************************************
不同的namespace之间是隔离的
Group可以把不同的微服务划分到一个组(解决订单重复消费问题)
*****************************************************************************************
Service就是微服务 HZ杭州   GZ 广州
【8】103集 Nacos配置Data ID
更改application.properties的修改test后,自动从nacos的client3377-test.properties读取内容
spring.profiles.active=test
http://localhost:3377/client3377_info
返回:test from nacos
*****************************************************************************************
讲道理项目小的话,DEFAULT_GROUP都够用的,但是吧,这是微服务,项目肯定不太小.....
【9】Nacos配置之Group分组方案
dev_group
*****************************************************************************************
spring.cloud.nacos.config.group=dev_group
spring.profiles.active=info
http://localhost:3377/client3377_info
返回:from nacos dev_group info
【10】Nacos配置之namespance(这个是最大的区分)
*****************************************************************************************
# 这个优先级最高,所以nacos配置要放到这个文件里
server.port=3377
spring.application.name=client3377
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 读取配置文件
spring.cloud.nacos.config.server-addr=localhost:8848
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.config.group=dev_group
spring.cloud.nacos.config.namespace=a183d481-0715-48c3-a788-eab71b1e73fd
*****************************************************************************************
# 开发环境
spring.profiles.active=dev
#spring.profiles.active=testhttp://localhost:3377/client3377_info
返回:from nacos self namespace self group self client3377-dev.properties
*****************************************************************************************
自己的配置虽然可以知道更多的知识,但是感觉使用的时候不太方便,那么我们就用默认的也挺好的
但是阳哥说了需要掌握,我就用自己配置的吧
【11】106集 Nacos集群与持久化配置 架构说明。先说集群!!!!!!!
nacos.com----vip(虚拟IP nginx)----nacos1+Nacos2+Nacos3
*****************************************************************************************
nacos自带了一个内嵌的数据库derby。
nacos采用了集中式存储的方式来支持集群化部署,目前支持mysql的存储。
*****************************************************************************************
nacos支持3中部署模式,单击模式、集群模式、多集群模式
*****************************************************************************************
不用单击模式+内嵌的数据库了。用集群配置+统一的外部mysql持久化存储(这是接下来讲的重点)
【12】107 Nacos持久化切换配置

****************************************************************************************************************************************************************************

18、Nacos
【1】服务注册与配置中心(Eureka+Git...)
Naming和Configuration的前两个字母,最后s为service
*****************************************************************************************
动态的服务发现、配置管理和服务管理平台,就是注册中心+配置中心
Nacos=Eureka+Config+Bus
*****************************************************************************************
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 "JAVA=C:\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
*****************************************************************************************
server90019002+client80都成功注册进了nacos!!!!!!!!!!!!!!!!!!!
【5】100集 服务中心的对比
Nacos可以切换CP AP模式。
性感荷官在线发牌,姿势可以切换。
【6】101集 Nacos服务配置中心
这一章非常重要
*****************************************************************************************
一定要先粘贴pom,不然application.properties都不能是被为绿叶子
@RefreshScope // 保持nacos动态刷新
*****************************************************************************************
Nacos的配置规则
spring.application.name=client3377
spring.profiles.active=dev
*****************************************************************************************
client3377-dev.properties  对应的nacos就要配置对应的文件名
*****************************************************************************************
所以本地配置拉取和nacos是一一对应的,spring.application.name-spring.profiles.active.properties
*****************************************************************************************
config.info=from nacos by wdfgdzx
*****************************************************************************************
http://localhost:3377/client3377_info
from nacos by wdfgdzx
*****************************************************************************************
卧槽好方便,那我以后用nacos配置开发了,沃日哦
【7】102 Nacos命名空间、分组、DataID三者之间的关系
配置多了怎么管理?
*****************************************************************************************
namespace是可以区分部署环境的。Group和dataID逻辑上区分目标对象。
默认情况
namespace:public
Group:DEFAULT_GROUP
Cluster:DEFAULT
*****************************************************************************************
不同的namespace之间是隔离的
Group可以把不同的微服务划分到一个组(解决订单重复消费问题)
*****************************************************************************************
Service就是微服务 HZ杭州   GZ 广州
【8】103集 Nacos配置Data ID
更改application.properties的修改test后,自动从nacos的client3377-test.properties读取内容
spring.profiles.active=test
http://localhost:3377/client3377_info
返回:test from nacos
*****************************************************************************************
讲道理项目小的话,DEFAULT_GROUP都够用的,但是吧,这是微服务,项目肯定不太小.....
【9】Nacos配置之Group分组方案
dev_group
*****************************************************************************************
spring.cloud.nacos.config.group=dev_group
spring.profiles.active=info
http://localhost:3377/client3377_info
返回:from nacos dev_group info
【10】Nacos配置之namespance(这个是最大的区分)
*****************************************************************************************
# 这个优先级最高,所以nacos配置要放到这个文件里
server.port=3377
spring.application.name=client3377
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 读取配置文件
spring.cloud.nacos.config.server-addr=localhost:8848
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.config.group=dev_group
spring.cloud.nacos.config.namespace=a183d481-0715-48c3-a788-eab71b1e73fd
*****************************************************************************************
# 开发环境
spring.profiles.active=dev
#spring.profiles.active=testhttp://localhost:3377/client3377_info
返回:from nacos self namespace self group self client3377-dev.properties
*****************************************************************************************
自己的配置虽然可以知道更多的知识,但是感觉使用的时候不太方便,那么我们就用默认的也挺好的
但是阳哥说了需要掌握,我就用自己配置的吧
【11】106集 Nacos集群与持久化配置 架构说明。先说集群!!!!!!!
nacos.com----vip(虚拟IP nginx也可以配置集群)----nacos1+Nacos2+Nacos3
*****************************************************************************************
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.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout3000&autoReconnect=true
db.user.0=root
db.password.0=123456
*****************************************************************************************
startup.cmd -m standalone 重启nacos,再访问就是全新的!!!!!
*****************************************************************************************
而且在nacos里里面配置的内容,在mysql的config_info就能看到了!!!!!!
【13】108 Linux版Nacos+Mysql生产环境配置
预计需要: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.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.0.205:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout3000&autoReconnect=true
db.user.0=root
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 weight=3;server 192.168.0.205:4444 weight=4;server 192.168.0.205:5555 weight=5;}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.port=9002
spring.application.name=alibaba-server90019002
# nacos 后面监控的暴露      服务器的Nginx地址!!!!!!!!!!!!!!!!!!!!!!!!!!!!
spring.cloud.nacos.discovery.server-addr=192.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?page=1
**************************************************************************************
后台+前台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,方便记忆)
[root@192 ~]# hostname
192.168.222.131
//修改主机别名为work3
[root@192 ~]# hostnamectl set-hostname 192-168-0-105 // 不能用·会显示不全
//重启服务器
[root@192 ~]# reboot
**************************************************************************************
工欲善其事必先利其器,磨刀不误砍柴工!!!!!!!!!!!!!!!!!!!!!!
导致我nginx配置的负载均衡地址也需要跟着变化....
nacos的数据库地址配置变化....
xxx.properties要变.... cluster.conf!!!!!!!!!!!!!
**************************************************************************************
有时候还是要找到根源,重新加载centos也是无济于事的.....最好是避免事情的发生,我日尼玛!!!!
**************************************************************************************
连着项目的application.properties也要跟着变
server.port=8001
spring.application.name=sentinel-server8001
# 注册到Linux的nacos集群
spring.cloud.nacos.discovery.server-addr=192.168.0.205:1111
spring.cloud.sentinel.transport.dashboard=192.168.0.205:8080
#默认是8719 假如被占用,则自动+1开始扫描,直到找到未占用的端口
spring.cloud.sentinel.transport.port=8719
management.endpoints.web.exposure.include=*
**************************************************************************************
终于大功告成,不负所托!!!!!!!!!!!!
**************************************************************************************
另外n+1个坑
第二种是,版本不一样。直接吧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 ,改变成和豪猪哥一样的限流提示。
从豪猪哥到@SentinelResource(===HystrixCommand)
@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?p1=1  稍微频繁刷新
则返回----test_key---exception---自定义的返回处理方法---
如果不配置,则直接就是报错页面了。对用户不友好,这个确实挺实用的
【14】热点规则---key下集说明(125集)---参数列外项
p1的值不同,限流不同.....卧槽好屌,做会员呢 VIP呢??????
http://192.168.0.205:8001/test_key?p1=3
刷刷就返回:----test_key---exception---自定义的返回处理方法---
http://192.168.0.205:8001/test_key?p1=5
刷刷刷还是正常的:----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整合ribbon+openFeign+fallback
*****************************************************************************************
中间插入下,配置下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包的作用--><build><plugins><plugin><artifactId>maven-surefire-plugin</artifactId><!-- 打包跳过单元测试 --><configuration><skipTests>true</skipTests><testFailureIgnore>true</testFailureIgnore></configuration></plugin><plugin><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target><encoding>utf-8</encoding></configuration></plugin></plugins></build>
*****************************************************************************************
<build><!-- 子pom打出来的jar包名 --><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.4.2</version><configuration><!-- 主启动类全类名 --><mainClass>com.day.xxxxx   !!!!!!!!!!这个名字注意改</mainClass></configuration><executions><execution><goals><!--可以把依赖的包都打包到生成的Jar包中--><goal>repackage</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 (type=Internal Server Error, status=500).
IllegalArgumentException,非法参数异常
*****************************************************************************************
http://192.168.0.205:84/client_fallback/5
对比下返回结果,肯定是有处理的舒服点,看着
{"code":"500","message":"兜底异常handler,exception内容NullPointerException,该ID没有记录,
空指针异常","object":{"id":5,"serial":null}}
【21】只配置blockHandler&&&fallback和blockHandler都配置
我个人感觉,处理好限流就行了,异常就异常呗,不就是页面不好看点吗,为什么要出现异常呢?
不应该从代码层面处理吗?
大佬说的对,处理好Sentinel限流就行了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
exceptionsToIgnore = {IllegalArgumentException.class} 忽略属性
其实也是响应了我的价值,为什么要出现异常呢?不应该从代码层面处理吗? 哈哈哈 笑死了
*****************************************************************************************
alibaba sentinel 是非常优秀的框架!!!!!!!!!!!!!
【22】Sentinel服务熔断OpenFeign
Fegin组件一般是消费者client84端
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
*****************************************************************************************
#开启对feign的支持
feign.sentinel.enabled=true
*****************************************************************************************
@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 后续持久化用   -->
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
*****************************************************************************************
# 持久化数据库配置
spring.cloud.sentinel.datasource.ds1.nacos.server-addr=192.168.0.205:1111
spring.cloud.sentinel.datasource.ds1.nacos.data-id=${spring.application.name}
spring.cloud.sentinel.datasource.ds1.nacos.group-id=DEFAULT_GROUP
spring.cloud.sentinel.datasource.ds1.nacos.data-type=json
spring.cloud.sentinel.datasource.ds1.nacos.rule-type=flow
*****************************************************************************************
// 预先在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+三组件模型
全局事务ID+3组件概念:
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有时候找不到,可能是本地配置问题,注释掉其他引入,单独引入看下!!!!!!
水到渠成,心急吃不了热豆腐,改怎么样还是要怎么样的
<!--  <dependency><groupId>com.alibaba</groupId><artifactId>druid-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 = "nacos"nacos {#serverAddr = "localhost"serverAddr = "192.168.0.205:1111"namespace = ""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?userId=1&productId=1&count=10&money=100
{"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?userId=1&money=100
故障情况:订单状态异常后,账号金额+库存照扣了!!!!!!!!!
由于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生成系统
*******************************************************************************
跟着阳哥打完收工!!!!!!!!!!!!!!!!!!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/831982.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过helm在k8s上安装minio

1 helm安装minio 1.1 下载minio 添加仓库 helm repo add bitnami https://charts.bitnami.com/bitnami 将minio拉取下来 helm pull bitnami/minio --version 版本号 解压到本地开始编辑配置文件 tar -zxf minio-xxx.tgz [rootk8s-master01 minio]# vi values.yaml 1.2…

Python-VBA函数之旅-open函数

目录 一、open函数的常见应用场景 二、open函数使用注意事项 三、如何用好open函数&#xff1f; 1、open函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博客 一、open函数的常见应用场…

Kannala-Brandt 鱼眼相机模型

最近在学习 ORB-SLAM3 的源代码&#xff0c;并模仿、重构了相机模型的实现 在学习的过程中发现针孔相机 (Pinhole) 与鱼眼相机 (Fisheye) 都有畸变参数&#xff0c;但是鱼眼相机无法使用 cv::undistort 函数去畸变 在对鱼眼相机的深度归一化平面进行可视化后&#xff0c;发现…

SQL 注入神器:SQLMap 简单使用

前言 SQLMap 是一款用于自动化 SQL 注入检测与渗透测试的开源工具&#xff0c;其主要功能是检测和利用 Web 应用程序中的 SQL 注入漏洞。以下是 SQLMap 的主要特点和功能&#xff1a; 自动化检测&#xff1a;SQLMap 可以自动发现 Web 应用程序中的 SQL 注入漏洞&#xff0c;包…

QT5之windowswidget_菜单栏+工具栏_核心控件_浮动窗口_模态对话框_标准对话框/文本对话框

菜单栏工具栏 新建工程基类是QMainWindow 1、 2、 3、 点.pro文件&#xff0c;添加配置 因为之后用到lambda&#xff1b; 在.pro文件添加配置c11 CONFIG c11 #不能加分号 添加头文件 #include <QMenuBar>//菜单栏的头文件 主窗口代码mainwindow.cpp文件 #include &q…

Hive大数据任务调度和业务介绍

目录 一、Zookeeper 1.zookeeper介绍 2.数据模型 3.操作使用 4.运行机制 5.一致性 二、Dolphinscheduler 1.Dolphinscheduler介绍 架构 2.架构说明 该服务内主要包含: 该服务包含&#xff1a; 3.FinalShell主虚拟机启动服务 4.Web网页登录 5.使用 5-1 安全中心…

局域网唤醒平台:UpSnap

简介&#xff1a;UpSnap是一个简单的唤醒局域网网络应用程序。UpSnap为每个用户、每个设备提供了唯一的访问权限。虽然管理员拥有所有权限&#xff0c;但他们可以为用户分配特定的权限&#xff0c;如显示/隐藏设备、访问设备编辑、删除和打开/关闭设备电源。 历史攻略&#xf…

给Ollama套个WebUI,方便使用

Ollama 基本的安装使用参考前文 https://xugaoxiang.com/2024/05/01/ollama-offline-deploy/&#xff0c;前文使用的模型是 llama2&#xff0c;本篇将使用 llama3&#xff0c;因此在启动时&#xff0c;命令是 ollama run llama3。 Ollama Llama3 Llama3 是 Meta 发布的大语言模…

Optional学习记录

Optional出现的意义 在Java中&#xff0c;我们经常遇到的一种异常情况&#xff1a;空指针异常&#xff0c;在原本的编程中&#xff0c;为了避免这种异常&#xff0c;我们通常会向对象进行判断&#xff0c;然而&#xff0c;过多的判断语句会让我们的代码显得臃肿不堪。 所以在J…

用LangChain打造一个可以管理日程的智能助手

存储设计定义工具创建llm提示词模板创建Agent执行总结 众所周知&#xff0c;GPT可以认为是一个离线的软件的&#xff0c;对于一些实时性有要求的功能是完全不行&#xff0c;比如实时信息检索&#xff0c;再比如我们今天要实现个一个日程管理的功能&#xff0c;这个功能你纯依赖…

拼多多关键词怎么推广

拼多多上的关键词推广可以通过以下步骤进行&#xff1a; 拼多多推广可以使用3an推客。3an推客&#xff08;CPS模式&#xff09;给商家提供的营销工具&#xff0c;由商家自主设置佣金比例&#xff0c;激励推广者去帮助商家推广商品链接&#xff0c;按最终有效交易金额支付佣金…

定子的检查和包扎及转子的检查

线圈接好后 用摇表测试 线圈和外壳之间的绝缘性&#xff01; 测试通过后进行焊接&#xff01;&#xff0c;焊接的工具在后面的文章中会介绍&#xff01; 焊接好后&#xff0c;包绝缘管。 焊接完成后 进行星型连接&#xff0c;或者三角形连接&#xff01; 白扎带进行绑扎&…

室外巡检机器人——A2型高防护轮式巡检机器人

在科技日新月异的时代&#xff0c;室外巡检机器人犹如一位无畏的守护者&#xff0c;悄然出现在我们的视野之中。它迈着坚定的步伐&#xff0c;穿梭于各种复杂的室外环境&#xff0c;承担着重要的巡检任务。它是科技与智慧的结晶&#xff0c;是保障安全与稳定的前沿力量。让我们…

【Python基础】进程

文章目录 [toc]程序与进程的区别与联系同步任务示例 并行任务示例进程调度的“随机性” 进程属性与方法process_object.start()方法process_object.join()方法process_object.daemon属性没有设置守护进程的情况设置守护进程的情况 process_object.current_process()方法 进程通…

数仓开发:DIM层数据处理

一、了解DIM层 这个就是数仓开发的分层架构 我们现在是在DIM层&#xff0c;从ods表中数据进行加工处理&#xff0c;导入到dwd层&#xff0c;但是记住我们依然是在DIM层&#xff0c;而非是上面的ODS和DWD层。 二、处理维度表数据 ①先确认hive的配置 -- 开启动态分区方案 -- …

c++:优先级队列(priority queue)使用及底层详解,附带仿函数初步使用

文章目录 优先级队列的使用大堆小堆**注意** 优先级队列的模拟实现pushpopsizeemptytop 仿函数仿函数是什么pushpop 仿函数结合优先级队列的优势 优先级队列的使用 优先级队列本质是就是完全二叉树,是个堆.我们可以用优先级队列来取出一段序列中的前N个最大值. priority_queue…

Postman的一些使用技巧

Postman 是一个流行的 API 开发工具&#xff0c;用于设计、开发、测试、发布和监控 API。在现代web开发中使用非常广泛。后端开发必备而且必会的工具。 目录 1.配置环境变量 2.动态变量 3.脚本 4.测试 5.模拟 6.监控 7.集合运行器 8.响应保存 9.请求历史 10.同步请求…

【论文阅读笔记】关于“二进制函数相似性检测”的调研(Security 22)

个人博客链接 注&#xff1a;部分内容参考自GPT生成的内容 [Security 22] 关于”二进制函数相似性检测“的调研&#xff08;个人阅读笔记&#xff09; 论文&#xff1a;《How Machine Learning Is Solving the Binary Function Similarity Problem》&#xff08;Usenix Securi…

面试算法-链表-反转链表(golang、c++)

目录 1、题目 2、解题思路 2.1 遍历、迭代 2.2 递归 3、源代码 3.1 c 3.2 golang 4、复杂度分析 4.1 遍历、迭代法 4.2 迭代法 1、题目 链表是一种常用的数据结构&#xff0c;链表的特点是插入、删除节点的效率非常高&#xff0c;因为他不需要移动其他任何元素&…

Linux——守护进程化(独立于用户会话的进程)

目录 前言 一、进程组ID与会话ID 二、setsid() 创建新会话 三、daemon 守护进程 前言 在之前&#xff0c;我们学习过socket编程中的udp通信与tcp通信&#xff0c;但是当时我们服务器启动的时候&#xff0c;都是以前台进程的方式启动的&#xff0c;这样很不优雅&#xff0c…