训练
森林森
java学习
展开
-
基于 Nacos 实现 Sentinel 规则持久化
Sentinel Dashboard中添加的规则数据存储在内存,微服务停掉规则数据就消失,在⽣产环境下不合适。我们可以将Sentinel规则数据持久化到Nacos配置中⼼,让微服务从Nacos获取规则数据在微服务中pom中添加<!-- Sentinel⽀持采⽤ Nacos 作为规则配置数据源,引⼊该适配依赖 --><dependency><groupId>com.alibaba.csp</groupId><artifactId>sen原创 2020-09-02 10:39:20 · 684 阅读 · 0 评论 -
Sentinel ⾃定义兜底逻辑
@SentinelResource注解类似于Hystrix中的@HystrixCommand注解@SentinelResource注解中有两个属性需要我们进⾏区分, blockHandler属性⽤来指定不满⾜Sentinel规则的降级兜底⽅法, fallback属性⽤于指定Java运⾏时异常兜底⽅法SentinelResourcevalue:定义资源名 就是个名称,随便起blockHandlerClass:指定Sentinel规则异常兜底逻辑所在class类blockHandler:指定Sen原创 2020-09-02 09:57:17 · 531 阅读 · 0 评论 -
Dubbo报错:Invalid name=“org.apache.dubbo.config.ApplicationConfig#0“ contains illegal character,
dubbo启动报错Invalid name="org.apache.dubbo.config.ApplicationConfig#0" contains illegal character, only digit, letter, '-', '_' or '.' is legal.Springboot2.2.9+ dubbo-spring-boot-starter2.2.1原因:没有指定name和id等属性,然后由spring会自动生成name,类似“org.apache.dubbo.config.原创 2020-09-01 18:50:16 · 15714 阅读 · 4 评论 -
Nacos 配置中⼼
Nacos 配置中⼼pom <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency>原创 2020-09-01 16:42:16 · 304 阅读 · 0 评论 -
搭建nacos集群并持久到mysql
官网教程https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html下载Nacoshttps://github.com/alibaba/nacos/tags本地mysql建立数据库数据库全名 = nacos_confighttps://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql/* * Copyright 1999-2018 Alibaba原创 2020-09-01 14:45:32 · 277 阅读 · 0 评论 -
Nacos 数据模型(领域模型)
Namespace命名空间、 Group分组、集群这些都是为了进⾏归类管理,把服务和配置⽂件进⾏归类,归类之后就可以实现⼀定的效果,⽐如隔离⽐如,对于服务来说,不同命名空间中的服务不能够互相访问调⽤Namespace:命名空间,对不同的环境进⾏隔离,⽐如隔离开发环境、测试环境和⽣产环境Group:分组,将若⼲个服务或者若⼲个配置集归为⼀组,通常习惯⼀个系统归为⼀个组Service:某⼀个服务,⽐如简历微服务DataId:配置集或者可以认为是⼀个配置⽂件Namespace + Group原创 2020-09-01 13:59:10 · 1175 阅读 · 0 评论 -
Nacos 保护阈值
保护阈值:可以设置为0-1之间的浮点数,它其实是⼀个⽐例值(当前服务健康实例数/当前服务总实例数)⼀般流程下, nacos是服务注册中⼼,服务消费者要从nacos获取某⼀个服务的可⽤实例信息,对于服务实例有健康/不健康状态之分, nacos在返回给消费者实例信息的时候,会返回健康实例。这个时候在⼀些⾼并发、⼤流量场景下会存在⼀定的问题如果服务A有100个实例, 98个实例都不健康了,只有2个实例是健康的,如果nacos只返回这两个健康实例的信息的话,那么后续消费者的请求将全部被分配到这两个实例,原创 2020-09-01 10:48:24 · 11880 阅读 · 0 评论 -
微服务统⼀认证⽅案 Spring Cloud OAuth2 + JWT
微服务架构下统⼀认证思路基于Session的认证⽅式在分布式的环境下,基于session的认证会出现⼀个问题,每个应⽤服务都需要在session中存储⽤户身份信息,通过负载均衡将本地的请求分配到另⼀个应⽤服务需要将session信息带过去,否则会重新认证。我们可以使⽤Session共享、 Session黏贴等⽅案。Session⽅案也有缺点,⽐如基于cookie,移动端不能有效使⽤等基于token的认证⽅式基于token的认证⽅式,服务端不⽤存储认证数据,易维护扩展性强, 客户端可以把toke原创 2020-08-28 19:08:31 · 586 阅读 · 0 评论 -
spring gateway-自定义路由断言工厂与局部GatewayFiler
自定义 RoutePredicateFactorypackage com.liu.predicate;import org.apache.commons.lang.StringUtils;import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;import org.springframework.stereotype.Component;import org.springf原创 2020-08-28 14:36:48 · 775 阅读 · 0 评论 -
spring cloud gatwway predicates Path多个路径
- id: service-autodeliver-router # 我们自定义的路由 ID,保持唯一 # uri: http://127.0.0.1:8096 # 目标服务地址 自动投递微服务(部署多实例) 动态路由:uri配置的应该是一个服务名称,而不应该是一个具体的服务实例的地址 uri: lb://edu-service-autodeliver # gateway网关从服务注册中心获取实例信息然后负载后路由 predicates:..原创 2020-08-28 11:48:22 · 9869 阅读 · 0 评论 -
微服务监控之分布式链路追踪技术 Sleuth + Zipkin
分布式链路追踪技术核⼼思想本质:记录⽇志,作为⼀个完整的技术,分布式链路追踪也有⾃⼰的理论和概念微服务架构中,针对请求处理的调⽤链可以展现为⼀棵树,示意如下⼀个请求通过⽹关服务路由到下游的微服务-1,然后微服务-1调⽤微服务-2,拿到结果后再调⽤微服务-3,最后组合微服务-2和微服务-3的结果,通过⽹关返回给⽤户为了追踪整个调⽤链路,肯定需要记录⽇志,⽇志记录是基础,在此之上肯定有⼀些理论概念,当下主流的的分布式链路追踪技术/系统所基于的理念都来⾃于Google的⼀篇论⽂《Dapper, a原创 2020-08-27 17:23:31 · 366 阅读 · 0 评论 -
spring cloud 常⻅问题及解决
常⻅问题及解决Eureka 服务发现慢的原因, Spring Cloud 超时设置问题新服务上线后,服务消费者不能访问到刚上线的新服务,需要过⼀段时间后才能访问?或是将服务下线后,服务还是会被调⽤到,⼀段时候后才彻底停⽌服务,访问前期会导致频繁报错?这些问题还会让你对 Spring Cloud 产⽣严重的怀疑,这难道不是⼀个 Bug?问题场景上线⼀个新的服务实例,但是服务消费者⽆感知,过了⼀段时间才知道某⼀个服务实例下线了,服务消费者⽆感知,仍然向这个服务实例在发起请求这其实就是服务发现的⼀原创 2020-08-25 18:44:52 · 323 阅读 · 0 评论 -
Spring Cloud Stream消息驱动组件
Spring Cloud Stream消息驱动组件Spring Cloud Stream 是⼀个构建消息驱动微服务的框架。应⽤程序通过inputs(相当于消息消费者consumer)或者outputs(相当于消息⽣产者producer)来与Spring Cloud Stream中的binder对象交互,⽽Binder对象是⽤来屏蔽底层MQ细节的,它负责与具体的消息中间件交互。说⽩了:对于我们来说,只需要知道如何使⽤Spring Cloud Stream与Binder对象交互即可StreamB原创 2020-08-25 18:10:04 · 155 阅读 · 0 评论 -
Spring cloud configServer配置中心简单使用
Spring cloud configServer配置中心简单使用 <dependencies> <!--eureka client 客户端依赖引⼊--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix原创 2020-08-25 16:26:07 · 297 阅读 · 0 评论 -
window下安装RabiitMQ
1.安装erlang网址:http://www.erlang.org/ 下载exe文件安装即可2.安装RabbitmQ下载地址:http://www.rabbitmq.com/download.html下载rabbitmq-server-3.6.5exe文件并安装3.添加RabbitMQ用户在Windows命令行进入安装目录的sbin目录下:D:\RabbitMQ Server\rabbitmq_server-3.6.5\sbin运行 rabbitmqctl.bat add_user r原创 2020-08-25 09:32:55 · 93 阅读 · 0 评论 -
centos7 安装rabbitmq
下载erlanghttp://www.erlang.org/downloads/19.3解压与安装安装依赖包yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel unixODBC-devel libtool libtool-ltdl-devel 解压tar zxvf otp-src_19.2.tar.gz配置cd opt_src_19.3./otp_build autoco原创 2020-08-25 09:32:21 · 109 阅读 · 0 评论 -
Spring-cloud-gateway
简单使用配置pom<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apach原创 2020-08-24 20:45:21 · 302 阅读 · 0 评论 -
Feign对熔断器的⽀持
Feign对熔断器的⽀持配置server: port: 8090spring: application: name: edu-service-autodeliver# 注册到eureka注册中eureka: client: service-url: # 使用逗号分隔 多个实例, defaultZone: http://EduCloudEurekaServerB:8762/eureka,http://EduCloudEurekaServerA:87原创 2020-08-24 12:27:16 · 161 阅读 · 0 评论 -
Feign简单使用
FeignFeign是Netflix开发的⼀个轻量级RESTful的HTTP服务客户端(⽤它来发起请求,远程调⽤的) ,是以Java接⼝注解的⽅式调⽤Http请求,⽽不⽤像Java中通过封装HTTP请求报⽂的⽅式直接调⽤, Feign被⼴泛应⽤在Spring Cloud 的解决⽅案中。类似于Dubbo,服务消费者拿到服务提供者的接⼝,然后像调⽤本地接⼝⽅法⼀样去调⽤,实际发出的是远程的请求。Feign可帮助我们更加便捷,优雅的调⽤HTTP API:不需要我们去拼接url然后呢调⽤restTem原创 2020-08-21 20:18:23 · 464 阅读 · 0 评论 -
@EnableHystrix或者@EnableCircuitBreaker-开启熔断器
开启@EnableDiscoveryClient@SpringBootApplication//@EnableHystrix 开启 Hystrix@EnableCircuitBreaker // 开启熔断器public class AutodeliverApplication8091 {配置方法上 //HystrixCommand进行熔断控制 HystrixCommandProperties @HystrixCommand( commandPropertie原创 2020-08-21 16:12:56 · 10102 阅读 · 0 评论 -
Ribbon核⼼源码解析-@LoadBalanced
Ribbon核⼼源码解析Ribbon给restTemplate添加了⼀个拦截器负载均衡管理器LoadBalancer(总的协调者,相当于⼤脑,为了做事情,协调四肢) ,围绕它周围的多有IRule、 IPing等IRule:是在选择实例的时候的负载均衡策略对象IPing:是⽤来向服务发起⼼跳检测的,通过⼼跳检测来判断该服务是否可⽤ServerListFilter:根据⼀些规则过滤传⼊的服务实例列表ServerListUpdater:定义了⼀系列的对服务列表的更新操作@LoadBala原创 2020-08-19 10:41:30 · 308 阅读 · 0 评论 -
Ribbon负载均衡策略
Ribbon内置了多种负载均衡策略,内部负责复杂均衡的顶级接⼝为 com.netflix.loadbalancer.IRule ,类树如下public interface IRule{ /* * choose one alive server from lb.allServers or * lb.upServers according to key * * @return choosen Server object. NULL is returned i原创 2020-08-19 08:56:55 · 174 阅读 · 0 评论 -
Eureka Client注册服务
Eureka Client注册服务动过程: Eureka客户端在启动时也会装载很多配置类,我们通过spring-cloud-netflix-eureka-client-xxxx.jar下的spring.factories⽂件可以看到加载的配置类EurekaClientAutoConfiguration//标志为配置类,可以被Spring扫描与管理@Configuration//启用配置属性@EnableConfigurationProperties@ConditionalOnClass(原创 2020-08-18 18:05:42 · 588 阅读 · 0 评论 -
Eureka Client下架服务
下架com.netflix.discovery.DiscoveryClient#shutdown关闭资源,解除注册,向注册中心发送下线请求 unregister public synchronized void shutdown() { if (isShutdown.compareAndSet(false, true)) { logger.info("Shutting down DiscoveryClient ..."); if原创 2020-08-18 16:26:23 · 305 阅读 · 0 评论 -
Eureka Server服务续约接⼝(接受客户端续约
com.netflix.eureka.registry.PeerAwareInstanceRegistryImplreplicateInstanceActionsToPeers private void replicateInstanceActionsToPeers(Action action, String appName, String id, InstanceInfo info, Instanc原创 2020-08-18 14:41:00 · 178 阅读 · 0 评论 -
Eureka Server服务注册接⼝(接受客户端注册服务)
Eureka Server服务注册接⼝(接受客户端注册服务)ApplicationResource类的addInstance()⽅法中代码: registry.register(info,“true”.equals(isReplication));@POST @Consumes({"application/json", "application/xml"}) public Response addInstance(InstanceInfo info,原创 2020-08-18 14:30:40 · 186 阅读 · 0 评论 -
Eureka Server服务接⼝暴露策略
org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration启动时注册 JerseyFilter @Bean public FilterRegistrationBean jerseyFilterRegistration( javax.ws.rs.core.Application eurekaJerseyApp) { FilterRegistrationBean bean = new FilterRe原创 2020-08-18 14:03:02 · 191 阅读 · 0 评论 -
EurekaServer-@EnableEurekaServer-启动过程
标志为EurekaServer@EnableEurekaServer@SpringBootApplicationpublic class EurekaServer8761 { public static void main(String[] args) { SpringApplication.run(EurekaServer8761.class,args); }}EnableEurekaServer@Target(ElementType.TYPE)@R原创 2020-08-18 11:59:23 · 728 阅读 · 0 评论 -
Eureka-数据解析
Eureka元数据详解Eureka的元数据有两种:标准元数据和⾃定义元数据。标准元数据: 主机名、 IP地址、端⼝号等信息,这些信息都会被发布在服务注册表中,⽤于服务之间的调⽤。⾃定义元数据: 可以使⽤eureka.instance.metadata-map配置,符合KEY/VALUE的存储格式。这 些元数据可以在远程客户端中访问server: port: 8091spring: application: name: edu-service-autodeliver main原创 2020-08-18 09:30:30 · 1651 阅读 · 0 评论 -
springboot yml配置文件使用@project.xxxx@ 不生效
ymlserver: port: 8080spring: application: name: edu-service-resume datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/edu?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateT原创 2020-08-17 19:42:02 · 1984 阅读 · 0 评论 -
spring-cloud-Eureka-server-简单配置
Eureka-server-简单配置server: port: 8761spring: application: name: edu-cloud-eureka-server # 应用名称,应用名称会在Eureka中作为服务名称eureka: instance: hostname: EduCloudEurekaServerA client: service-url: # 配置客户端所交互的Eureka Server的地址(Eureka Server原创 2020-08-17 19:12:27 · 231 阅读 · 0 评论 -
Dubbo-数据包结构解析
Dubbo数据包dubbo协议采用固定长度的消息头(16字节)和不定长度的消息体来进行数据传输,消息头定义了底层框架(netty)在IO线程处理时需要的信息协议详情Magic - Magic High & Magic Low (16 bits)标识协议版本号,Dubbo 协议:0xdabbSerialization ID (5 bit)标识序列化类型:比如 fastjson 的值为6Event (1 bit)标识是否是事件消息,例如,心跳事件。如果这是一个事件,则设置原创 2020-08-11 19:27:53 · 651 阅读 · 0 评论 -
Dubbo-Invoker执行逻辑
Invoker接口public interface Invoker<T> extends Node { /** * get service interface. * * @return service interface. * 当前执行器的服务接口是哪一个 */ Class<T> getInterface(); /** * invoke. * * @param invoc原创 2020-08-11 18:58:02 · 505 阅读 · 0 评论 -
Dubbo-集群容错-解析
Dubbo-集群容错感念集群工作过程可分为两个阶段,第一个阶段是在服务消费者初始化期间,集群 Cluster 实现类为服务消费者创建 Cluster Invoker 实例,即上图中的 merge 操作。第二个阶段是在服务消费者进行远程调用时。以 FailoverClusterInvoker 为例,该类型 Cluster Invoker 首先会调用 Directory 的 list 方法列举Invoker 列表(可将 Invoker 简单理解为服务提供者)Directory 的用途是保存 Invo原创 2020-08-11 17:43:32 · 906 阅读 · 0 评论 -
Dubbo-getExtensionLoader 步骤
getExtensionLoader 加载过程先去缓存中EXTENSION_LOADERS private static final ConcurrentMap<Class<?>, ExtensionLoader<?>> EXTENSION_LOADERS = new ConcurrentHashMap<>(64); 加载第一次是空创建一个新的放入,value new ExtensionLoader()new ExtensionLoader构造方法,E原创 2020-08-11 09:37:40 · 258 阅读 · 0 评论 -
Dubbo-Adaptive实现解析
Dubbo-Adaptive实现解析介daptive的主要功能是对所有的扩展点进行封装为一个类,通过URL传入参数的时动态选择需要使用的扩展点。其底层的实现原理就是动态代理ExtensionLoader-getAdaptiveExtension public T getAdaptiveExtension() { //从缓存中获取 进行Holder和加锁的方式来保证只会被创建一次 Object instance = cachedAdaptiveInstance.原创 2020-08-10 21:38:47 · 376 阅读 · 0 评论 -
Dubbo -ExtensionLoader-源码-解析
ExtensionLoadergetExtensionLoader 获取扩展点加载器 并加载所对应的所有的扩展点实现getExtension 根据name 获取扩展的指定实现成员变量 private static final Logger logger = LoggerFactory.getLogger(ExtensionLoader.class); private static final Pattern NAME_SEPARATOR = Pattern.compile("\原创 2020-08-10 21:12:49 · 229 阅读 · 0 评论 -
URL规则详解 和 服务本地缓存
URL地址protocol://host:port/path?key=value&key=valuedubbo://10.18.200.149:20880/org.apache.dubbo.demo.DemoService?anyhost=true&application=demo-provider&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=org.apach原创 2020-08-10 17:42:12 · 870 阅读 · 0 评论 -
Dubbo-服务暴露源码-解析
-ServiceConfig-doExport protected synchronized void doExport() { if (unexported) { throw new IllegalStateException("The service " + interfaceClass.getName() + " has already unexported!"); } if (exported) {原创 2020-08-10 17:06:17 · 720 阅读 · 0 评论 -
Dubbo -整体调用链路
服务消费者通过代理对象 Proxy 发起远程调用,接着通过网络客户端 Client 将编码后的请求发送给服务提供方的网络层上,也就是 Server。Server 在收到请求后,首先要做的事情是对数据包进行解码。然后将解码后的请求发送至分发器 Dispatcher,再由分发器将请求派发到指定的线程池上,最后由线程池调用具体的服务。这就是一个远程调用请求的发送与接收过程淡绿色代表了 服务生产者的范围 淡蓝色 代表了服务消费者的范围 红色箭头代表了调用的方向业务逻辑层(Interface )R.原创 2020-08-10 10:45:39 · 2313 阅读 · 0 评论