关于springcloud:Spring-Cloud-学习一基础环境搭建

创立父工程 父工程pom.xml <packaging>pom</packaging> <!-- 对立治理jar包版本 --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <junit.version>4.12</junit.version> <log4j.version>1.2.17</log4j.version> <lombok.version>1.16.18</lombok.version> <mysql.version>5.1.47</mysql.version> <druid.version>1.1.21</druid.version> <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version> </properties> <dependencyManagement> <!-- 子模块继承之后,提供作用:锁定版本+子modlue不必写groupId和version --> <dependencies> <!--spring boot 2.2.2--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.2.2.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <!--spring cloud Hoxton.SR1--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR1</version> <type>pom</type> <scope>import</scope> </dependency> <!--spring cloud alibaba 2.1.0.RELEASE--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis.spring.boot.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> <addResources>true</addResources> </configuration> </plugin> </plugins> </build>创立子模块 cloud-provider-payment8001pom.xml ...

November 9, 2020 · 3 min · jiezi

关于spring-cloud:wanxin-finance

开户创立mapper模板

November 8, 2020 · 1 min · jiezi

关于spring-cloud:wanxin金融

day 1day 2 用户注册增加的apollo额定配置另外数据库的名称,路由的开始门路/account

November 7, 2020 · 1 min · jiezi

关于spring-cloud:红包雨项目

概述及根底储备zookeeperzookeeper利用概述zookeeper之zkui

November 6, 2020 · 1 min · jiezi

关于springcloud:学习总结之SpringCloud中Feign和Zuul的区别

1.概述SpringCloud是一系列框架的汇合,它推崇一站式解决问题。外面有两个框架Feign和Zuul,两者都是集成了Ribbon和Hystrix框架,同时都具备近程调用的性能。性能上有重叠的两个框架为什么会同时应用?在解决这个问题之前,先简略介绍一下两者在应用上的区别 2.应用区别2.1近程调用2.1.1 FeignFeign的近程调用在于应用接口,调用接口办法来实现近程调用,就像在浏览器地址栏输出申请一样。 2.1.2 ZuulZuul的调用是通过一个配置文件,来实现门路的映射。个人感觉有点相似于Nginx,通过门路映射到id,通过id找到服务。 2.2默认设置2.2.1 FeignFeign默认已启用了 ribbon 负载平衡和重试机制,能够间接应用。然而默认没有启用hystrix。如果非要应用最好先引入hystrix的依赖,接着在配置文件开启hystrix的应用。 2.2.2 Zuulzuul曾经集成了ribbon和hystrix,默认曾经实现了负载平衡。然而Zuul默认没有启用重试性能。如果肯定要应用这个性能,首先要导入 spring-retry 依赖,接着在配置文件中开启重启性能。 2.3权限管制这个是Zuul独有的性能,它能通过过滤器,执行过滤办法,达到权限管制的作用。 3.同时应用两个框架的起因集体看来Zuul像是家里的总闸,电流(申请)从总闸流入,流到不同的电器中。所以它默认不开启重试性能,否则每次重试都要流经多个用电设施,不仅响应慢,而且极消耗资源。Feign像是连贯两个服务器的导线。它重视业务关系,所以默认不开启hystrix。就像用电设施是不具备跳闸性能的,它上下游的服务器长时间得不到响应,也会熔断。这是不符合实际状况的。所以尽管性能上用反复的中央,然而利用场景不同,决定了要同时应用两个框架。最初大胆揣测一波,接下来会呈现一个整合两者的框架,用来缩小性能的冗余。

November 1, 2020 · 1 min · jiezi

关于springcloud:SpringCloud服务起步-1service服务

service -服务 商品服务 item service,端口8001用户服务 user service,端口8101订单服务 order service,端口8201 commons通用我的项目新建maven我的项目pom.xml <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.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.tedu</groupId> <artifactId>sp01-commons</artifactId> <version>0.0.1-SNAPSHOT</version> <name>sp01-commons</name> <dependencies> <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-parameter-names</artifactId> <version>2.9.8</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jdk8</artifactId> <version>2.9.8</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>2.9.8</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-guava</artifactId> <version>2.9.8</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.6</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.26</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.9</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build></project>java 源文件 ...

October 30, 2020 · 11 min · jiezi

关于springcloud:Spring-Cloud微服务入门

1.SpringCloud介绍Spring Cloud是一系列框架的汇合。它利用SpringBoot的开发便利性奇妙地简化了分布式系统基础设施的开发,如服务发现注册、配置核心、音讯总线、负载平衡、断路器、数据监控等,都能够用SpringBoot的开发格调做到一键启动和部署。SpringCloud并没有反复制作轮子,它只是将目前各家公司开发的比拟成熟、经得起理论考验的服务框架组合起来,通过SpringBoot格调进行再封装屏蔽掉了简单的配置和实现原理,最终开发者留出了一套简略易懂、易部署和易保护的分布式系统开发工具包。 应用SpringCloud一站式解决方案能在从容应对业务倒退的同时大大减少开发成本。 2.SpringCloud组成 eureka 微服务治理,服务注册和发现ribbon简单平衡、申请重试hystrix断路器,服务降级、熔断feignribbon+hystrix集成,并提供申明式客户端hystrix dashboard和turbinehystrix数据监控zuulAPI网关,提供微服务的对立入口,并提供对立的权限验证config配置核心bus音讯总线,配置刷新sleuth+zipkin链路跟踪3.SpringCloud比照Dubbo Dubbo Dubbo只是一个近程调用(RPC)框架默认基于长连贯,反对多种序列化格局Spring Cloud 框架集提供了一整套微服务解决方案(全家桶)基于http调用,Rest API

October 30, 2020 · 1 min · jiezi

关于spring-cloud:第五阶段1023

spring cloud介绍spring cloud 是一系列框架的汇合。它利用 spring boot 的开发便利性奇妙地简化了分布式系统基础设施的开发,如服务发现注册、配置核心、音讯总线、负载平衡、断路器、数据监控等,都能够用 spring boot 的开发格调做到一键启动和部署。spring cloud 并没有反复制作轮子,它只是将目前各家公司开发的比拟成熟、经得起理论考验的服务框架组合起来,通过 spring boot 格调进行再封装屏蔽掉了简单的配置和实现原理,最终给开发者留出了一套简略易懂、易部署和易保护的分布式系统开发工具包。 spring cloud 对于中小型互联网公司来说是一种福音,因为这类公司往往没有实力或者没有足够的资金投入去开发本人的分布式系统基础设施,应用 spring cloud 一站式解决方案能在从容应对业务倒退的同时大大减少开发成本。同时,随着近几年微服务架构和 docker 容器概念的火爆,也会让 spring cloud 在将来越来越“云”化的软件开发格调中立有一席之地,尤其是在目前形形色色的分布式解决方案中提供了标准化的、一站式的技术计划,意义可能会堪比当年 servlet 标准的诞生,无效推动服务端软件系统技术水平的提高。 spring cloud技术组成 eureka微服务治理,服务注册和发现ribbon负载平衡、申请重试hystrix断路器,服务降级、熔断feignribbon + hystrix 集成,并提供申明式客户端hystrix dashboard 和 turbinehystrix 数据监控zuulAPI 网关,提供微服务的对立入口,并提供对立的权限验证config配置核心bus音讯总线, 配置刷新sleuth+zipkin链路跟踪Spring Cloud 比照 Dubbo Dubbo Dubbo只是一个近程调用(RPC)框架默认基于长连贯,反对多种序列化格局Spring Cloud 框架集提供了一整套微服务解决方案(全家桶)基于http调用, Rest APIapplication.yml文件向注册核心注册的服务名sping: application: name: item-serviceserver: port: 8001 eureka: server: enable-self-presevation: false #1.保护模式instance: hostname: eureka1 ##2.集群服务器间用主机名辨别client: #3.单台服务器。不向本人注册 不从本人拉取 register-with-eureka: false fetch-registry: false ...

October 23, 2020 · 1 min · jiezi

关于spring-cloud:Spring-Cloud-AlibabaNacos-安装及使用

Spring Cloud Alibaba:Nacos 装置及应用Nacos 是什么? Nacos 致力于帮忙开发者发现、配置和治理微服务。Nacos 提供了一组简略易用的个性集,帮忙开发者疾速实现动静服务发现、服务配置、服务元数据及流量治理。Nacos 帮忙开发者更麻利和容易地构建、交付和治理微服务平台。 Nacos 是构建以“服务”为核心的古代利用架构 (例如微服务范式、云原生范式) 的服务基础设施。Nacos 次要蕴含两个局部,一个是配置核心,一个是服务注册与发现。本系列的文章将顺次对其进行分享介绍。本篇将着重介绍 Nacos 的单机与集群装置及一些根本的应用。 版本阐明Windows: win 10 64位零碎Linux: Centos 7 64位零碎Nacos: 1.3.2 (以后最新稳固版本)Windows 单机装置下载软件包返回 GitHub Nacos Release 下载 nacos-server-1.3.2.zip 软件包到本地。本地解压,目录构造如下图所示。 bin : 启动/敞开脚本conf : Nacos 的配置文件data : 未做长久化的时候数据会存储在此,比方配置数据(第一次运行后才会生成)logs : Nacos 日志(第一次运行后才会生成)target : nacos-server.jar 运行文件参数配置关上文件 conf/application.properties 文件,对 nacos 进行配置。 ### 配置网页端拜访端口server.port=8848### 配置数据长久化的数据库,这里应用 mysql### 这里的配置默认是正文掉的,须要手动去除正文### 如果须要启用数据库的话,须要导入 conf/nacos-mysql.sql 脚本### 如果不启用数据库,则数据将长久化到本地 data/ 目录下### If use MySQL as datasource:spring.datasource.platform=mysql### Count of DB:db.num=1### 数据库能够有多个,db.url.0=xxx db.url.1=xxx db.url.2=xxx### 此处仅应用一个### Connect URL of DB:db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTCdb.user=usernamedb.password=password### 关上认证受权零碎,默认为 false ### 此项配置并不会影响网页端的登录,设置为 true 或是 false 网页端拜访时均须要登录### 此项配置开启的话,在代码中须要配置 nacos 的用户名及明码### 即 spring.cloud.nacos.username 和 spring.cloud.nacos.password 两个参数,对应的是网页端登录的用户名明码### If turn on auth system:nacos.core.auth.enabled=true### 其余配置依据本人的需要配置即可留神: > ...

October 9, 2020 · 3 min · jiezi

关于springcloud:SpringCloudAlibaba微服务开发实战一个案例手把手带你入门

技术实践随处可见,咱们还缺什么?缺实战案例,夸夸其谈经不住考验,从头到尾经验一次能力记忆粗浅。本篇文章就带你实实在在走一次。联合SpringCloud、SpringCloudAlibaba、Dubbo等开源套件,基于某商场停车业务需要,进行微服务开发实战,力争通过一个案例的实操,把握微服务架构中罕用的技能点,轻松入门。 为什么要写这个专栏(为什么?)微服务近两年的炽热,也将很多公司的架构缓缓转向微服务,但要间接上手微服务,还须要能过实操演练,一直晋升,能力在工作中熟能生巧。 网络上相干资源很多,但大多散乱无章,不成体系,不利于系统性把握,无奈一步步的深刻其中,更不能粗浅把握各个组件在我的项目中理论交融状况。 尽管也有一些案例,但短少相干的文档细节形容,对初学者而言,仅靠浏览代码,难免会只知其一;不知其二。于是,我就推敲写一个贴合理论场景的小例子,业务无需很简单,能将这一套技术体系串连起来,本人能够跟着入手实操,通过一步一步的上手,加深对技术栈的了解。 通过本专栏要达成什么指标(到哪里去?)本专栏将带你完整性的施行一个我的项目,从需要整顿、剖析设计、存储设计、要害业务流程设计、编码、测试(单元测试,零碎测试)、部署上线、日常监控保护等等。 时下采纳麻利研发模式做产品曾经不是什么新鲜事,本专栏中也会适当融入一些麻利办法,进行团队合作演练。程序员同学广泛比拟关注硬技能的晋升,所以把握要害技能很重要。同时,软技能也要随着硬技能的晋升,同样失去锤炼升华,比拟团队合作能力、沟通理解能力、解决问题能力、领导治理能力等等。 本专栏实战案例波及到的技术栈做Java,绕不开Spring。用Java做微服务开发,也绕不开Spring Cloud。但随着Dubbo的重启,并交给Apache开源社区保护后,Dubbo生态越来越欠缺。尽管拿Spring Cloud与Dubbo作比拟不适合,但不少敌人在技术选型时会纠结抉择Dubbo还是Spring Cloud,spring-cloud-alibaba的呈现,将Dubbo生态完满的与Spring Cloud生态交融在一起。你不必再纠结抉择Dubbo还是Spring Cloud,两者能够兼容的很好。 上面列举下可能会应用到的技术栈: 反向代理:Nginx,可做动静拆散部署对立网关:基于spring-cloud-gateway,配合JWT进行的简略的验权操作分布式事务:Seata,阿里外部分布式事务产品一直迭代演进而来。降级、限流:Hysrix/Sentinel服务治理:Nacos分布式配置核心:Nacos客户端负载平衡:OpenFeign异步音讯:RocketMQ,阿里开源,交由Apache孵化链路跟踪:Skywalking,华为开源,交由Apache孵化分布式缓存:Redis衰弱监控:spring-boot-admin分布式锁:Redission代码简化:Lambok,mybatis-plus,mybatis-generatorRPC框架:Apache dubbo实操我的项目中也会波及到一些小组件、小技巧,更加贴近商业我的项目开发实战,一起入手口头起来吧,微服务架构并不深奥,你能够把握的更好。 专栏合适人群程序员、零碎架构师、IT从业者、项目管理人员、IT管理人员、产品经理、业务架构师 源码地址https://xiaozhuanlan.com/msa-practice

October 6, 2020 · 1 min · jiezi

关于springcloud:Spring-Cloud-2020-年路线图发布

JetBrains 发文介绍了其 IntelliJ 平台 2020 年的路线图。 文章次要介绍了以后 JetBrains 在改良 IntelliJ IDEA 和基于 IntelliJ 平台的 IDE 方面所做的一些工作,次要包含性能和对古代开发工作流的反对两个方面。改良后果将会在明年公布,其中一些会公布在秋季的 2020.1 版本中。 性能索引性能与 IDE 性能无关的两个次要痛点是启动性能,索引耗时较长的工具被认为是重量级的。JetBrains 示意,明年关注点将转向索引性能方面。 针对此问题官网采取了多管齐下的办法。首先,反对应用预建的索引块,这样每个用户 IntelliJ 实例都不用执行索引java.lang.String类的工作。 打算明年逐渐提供反对,从 JDK 开始,而后涵盖 Maven Central 的库以及其它 IDE 中的解释器和包。同时还在钻研反对团队或企业内我的项目源代码的索引块共享的办法,尽管这一块目前还没有任何具体打算。 其次,打算通过在索引时提供更多的 IDE 操作来缩小索引的破坏性。 第三,将检测并告诉用户无关索引异样的信息,包含索引破费工夫太长的文件、索引从新建设频率太高的文件以及异样导致的索引重建,目标是提供解决这些问题并进步 IDE 在我的项目上的性能的清晰步骤。 同时也打算反对进行旧性能优化,以确保索引零碎不会执行任何不必要的工作并且不会产生可防止的开销。 读/写锁线程模型从新设计UI 卡死(freeze,解冻)是一个很大的问题。往年尽管曾经构建了用于报告此类卡死问题的根底,并进行了架构更改以修复许多相干问题,比方文件系统事件的异步侦听器,然而接下来的一年中,打算迈出更大的一步:将须要写锁定的操作移出 UI 线程。 早在 IntelliJ IDEA 晚期就做出了一项架构决定,该决定要求大多数操作须要批改 IDE 的外部数据结构能力在 UI 线程上运行,也就是包含基本操作(将字符插入文档中)和大规模操作(重新命名具备数千种用法的办法)。 这种架构的益处是简略的编程模型,然而显著的毛病是 UI 响应能力在许多状况下都会受到影响。 多年以来,官网始终在寻找办法来解决此架构的局限性,次要是将大型操作拆分为在后盾运行并利用于 UI 线程的局部。一个更根本的解决方案是齐全解脱 UI 线程的要求,然而直到最近,还不晓得如何在不对本人的代码和第三方插件进行重大重写的状况下做到这一点。 不过当初,JetBrains 曾经有了一个容许逐渐迁徙的架构解决方案,并且正在开始施行。明年将重构 IntelliJ 平台的根本 UI 组件和 API,以采纳新的线程模型。一旦新模型稳固并且能够看到改良,将在所有 IDE 中切换到新模型,从而使 UI 平滑且没有滞后。 ...

September 25, 2020 · 1 min · jiezi

关于springcloud:Spring-Cloud在k8s下使用IDEA进行本地开发

写在后面咱们在k8s去掉了Eureka组件,引入spring-cloud-kubernetes组件。一、所需工具或命令kubectl命令Shadowsocks ServerShadowsocks ClientKT Connect原本只须要kubectl命令和kt connect就行了,次要是kt connect现有的socks5代理服务有点问题,至多在我这边是这样,0.0.12版本的话idea外面的程序起不来,0.0.13-rc11版本的话vpn和socks5延时高,常常超时。所以萌发了用shadowsocks server来替换kt connect外面的socks5服务(也就是kt connect这一步),kt其余的性能还是依旧,这样就完满联合了。 如果是mac电脑或者ubuntu零碎的电脑的话用0.0.12版本的kt的vpn连贯是没有问题的,然而我还是倡议应用socks5的模式,因为这样不是所有的流量都走vpn,而且其余的开发人员不须要在本机启动vpn代理,只须要通过shadowsocks client连上k8s内的服务,就能够应用kt命令了。 二、装置2.1 装置kubectl命令参考官网地址装置:https://kubernetes.io/zh/docs/tasks/tools/install-kubectl/ ,装置实现后在用户目录下(Mac或Ubuntu用户:/Users/xxxxxx ; Windows用户: C:UsersAdministrator)下手动建设 .kube 文件夹,而后将群外面的config文件拷贝到这外面。操作完后应用命令kubectl get pods查看是否装置实现。如果失败认真查看官网装置步骤,重新安装。 装置实现后,批改hosts文件在其中增加上面记录(联合本人的k8s集群的apiserver地址来设置) 192.168.1.236 k8s.apiserver 2.2 装置Shadowsocks Server服务端编写yml文件,并在k8s集群的default命名空间中执行。 ---apiVersion: apps/v1kind: Deploymentmetadata: name: shadowsocks-server-deployment namespace: default labels: app: shadowsocks-server-deploymentspec: replicas: 1 selector: matchLabels: app: shadowsocks-server-pod template: metadata: labels: app: shadowsocks-server-pod spec: containers: - name: shadowsocks-server-container image: shadowsocks/shadowsocks-libev command: [ # need to modify "-d" to k8s core-dns "--fast-open" "ss-server","-s","0.0.0.0", "-p", "8388", "-t", "300","-k", "代理明码", "-m", "aes-256-cfb", "-d", "10.96.0.10,114.114.114.114", "-u" ] ports: - containerPort: 8388 protocol: TCP name: tcp - containerPort: 8388 protocol: UDP name: udp---apiVersion: v1kind: Servicemetadata: name: shadowsocks-server namespace: defaultspec: type: NodePort ports: - port: 8388 targetPort: 8388 nodePort: 32088 protocol: TCP name: tcp - port: 8388 targetPort: 8388 nodePort: 32088 protocol: UDP name: udp selector: app: shadowsocks-server-pod我这里间接用的是NodePort来开发端口,你们也能够应用ingress来裸露服务 ...

September 25, 2020 · 1 min · jiezi

关于springcloud:springcloud和zookeeper

springcloud的eureka注册核心1.注册每当一个提供者开启服务时就会一直的向注册发动注册申请,直到胜利注册2.拉取每30秒拉取一次注册表,更新注册表(当一个服务器拉取取得注册表就会在本地保留,注册核心宕了也不受影响)3.自我爱护当注册核心有心跳检测85%以上的心跳异样时开启注册核心,不删除表中的注册信息4.心跳检测当有服务器心跳异样时不会第一工夫删除该服务器注册的信息,而是每30秒向服务器发动心跳检测,3次没有回应则判断服务器挂了,删除该服务器注册信息zookeeper注册核心与eureka注册核心区别eurekaAP模式(强调可用性每阁一段时间更新,最终达到统一即可)集群(同级构造)zookeeperCP模式(强调一致性及时更新注册信息表)集群(主从构造)

September 23, 2020 · 1 min · jiezi

关于springcloud:SpringcloudMybatis使用多数据源的四种方式

前段时间在做会员中心和中间件零碎开发时,屡次碰到多数据源配置问题,次要用到分包形式、参数化切换、注解+AOP、动静增加 这四种形式。这里做一下总结,分享下应用心得以及踩过的坑。 分包形式数据源配置文件在yml中,配置两个数据源,id别离为master和s1。 spring: datasource: master: jdbcUrl: jdbc:mysql://192.168.xxx.xxx:xxxx/db1?......... username: xxx password: xxx driverClassName: com.mysql.cj.jdbc.Driver s1: jdbcUrl: jdbc:mysql://192.168.xxx.xxx:xxxx/db2?........ username: xxx password: xxx driverClassName: com.mysql.cj.jdbc.Driver数据源配置类master数据源配置类留神点: 须要用@Primary注解指定默认数据源,否则spring不晓得哪个是主数据源; @Configuration@MapperScan(basePackages = "com.hosjoy.xxx.xxx.xxx.xxx.mapper.master", sqlSessionFactoryRef = "masterSqlSessionFactory")public class MasterDataSourceConfig { //默认数据源 @Bean(name = "masterDataSource") @Primary @ConfigurationProperties(prefix = "spring.datasource.master") public HikariDataSource masterDataSource() { return DataSourceBuilder.create().type(HikariDataSource.class).build(); } @Bean(name = "masterSqlSessionFactory") @Primary public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource datasource, PaginationInterceptor paginationInterceptor) throws Exception { MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean(); bean.setDataSource(datasource); bean.setMapperLocations( // 设置mybatis的xml所在位置 new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/master/**/**.xml")); bean.setPlugins(new Interceptor[]{paginationInterceptor}); return bean.getObject(); } @Bean(name = "masterSqlSessionTemplate") @Primary public SqlSessionTemplate masterSqlSessionTemplate( @Qualifier("masterSqlSessionFactory") SqlSessionFactory sessionfactory) { return new SqlSessionTemplate(sessionfactory); }}s1数据源配置类@Configuration@MapperScan(basePackages = "com.hosjoy.xxx.xxx.xxx.xxx.mapper.s1", sqlSessionFactoryRef = "s1SqlSessionFactory")public class S1DataSourceConfig { @Bean(name = "s1DataSource") @ConfigurationProperties(prefix = "spring.datasource.s1") public HikariDataSource s1DataSource() { return DataSourceBuilder.create().type(HikariDataSource.class).build(); } @Bean(name = "s1SqlSessionFactory") public SqlSessionFactory s1SqlSessionFactory(@Qualifier("s1DataSource") DataSource datasource , PaginationInterceptor paginationInterceptor) throws Exception { MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean(); bean.setDataSource(datasource); bean.setMapperLocations( // 设置mybatis的xml所在位置 new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/s1/**/**.xml")); bean.setPlugins(new Interceptor[]{paginationInterceptor}); return bean.getObject(); } @Bean(name = "s1SqlSessionTemplate") public SqlSessionTemplate s1SqlSessionTemplate( @Qualifier("s1SqlSessionFactory") SqlSessionFactory sessionfactory) { return new SqlSessionTemplate(sessionfactory); }}应用能够看出,mapper接口、xml文件,须要依照不同的数据源分包。在操作数据库时,依据须要在service类中注入dao层。 ...

September 22, 2020 · 5 min · jiezi

关于springcloud:SpringCloud-简介

SpringCloudSpringCloud是什么是工具集--集成了多个工具,来解决微服务中遇到的各种问题是微服务大礼包--用于解决各种各样的微服务问题是微服务的整体解决方案--一站式解决微服务问题 SpringCloud不是什么不是解决繁多问题的框架--如:mybatis解决长久层问题/springmvc解决mvcweb问题... SpringCloud技术组成eureka微服务治理,服务注册和发现ribbon负载平衡、申请重试hystrix断路器,服务降级、熔断feignribbon + hystrix 集成,并提供申明式客户端hystrix dashboard 和 turbinehystrix 数据监控zuulAPI 网关,提供微服务的对立入口,并提供对立的权限验证config配置核心bus音讯总线, 配置刷新sleuth+zipkin链路跟踪SpringCloud与Dubbo比照DubboDubbo只是一个近程调用(RPC)框架默认基于长连贯,反对多种序列化格局 Spring Cloud框架集提供了一整套微服务解决方案(全家桶)基于http调用, Rest API

September 22, 2020 · 1 min · jiezi

关于springcloud:SpringCloud源码解析-Eureka原理探究

本文通过浏览Eureka源码,分享Eureka的实现原理。本文次要梳理Eureka整体设计及实现,并不一一列举Eureka源码细节。 源码剖析基于Spring Cloud Hoxton,Eureka版本为1.9 Eureka分为Eureka Client,Eureka Server,多个Eureka Server节点组成一个Eureka集群,服务通过Eureka Client注册到Eureka Server。 CAP实践指出,一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)。 因为分布式系统中必须保障分区容错性,因而咱们只能在A和C之间进行衡量。Zookeeper保障的是CP, 而Eureka则是保障AP。为什么呢?在注册核心这种场景中,可用性比一致性更重要。作为注册核心,其实数据是不常常变更的,只有服务公布,机器高低线,服务扩缩容时才变更。因而Eureka抉择AP,即便出问题了,也返回旧数据,保障服务能(最大水平)失常调用, 避免出现因为注册核心的问题导致服务不可用这种得失相当的状况。所以,Eureka各个节点都是平等的(去中心化的架构,无master/slave辨别),挂掉的节点不会影响失常节点的工作,残余的节点仍然能够提供注册和查问服务。 Eureka ClientEureka 1.9只有引入spring-cloud-starter-netflix-eureka-client依赖,即便不应用@EnableDiscoveryClient或@EnableEurekaClient注解,服务也会注册到Eureka集群。 client次要逻辑在com.netflix.discovery.DiscoveryClient实现,EurekaClientAutoConfiguration中构建了其子类CloudEurekaClient。 定时工作DiscoveryClient#initScheduledTasks办法设置定时工作,次要有CacheRefreshThread,HeartbeatThread,以及InstanceInfoReplicator。 同步服务注册信息缓存在DiscoveryClient#localRegionApps变量中,CacheRefreshThread负责定时从Eureka Server读取最新的服务注册信息,更新到本地缓存。CacheRefreshThread -> DiscoveryClient#refreshRegistry -> DiscoveryClient#fetchRegistry当存在多个Eureka Server节点时,Client会与eureka.client.serviceUrl.defaultZone配置的第一个Server节点同步数据,当第一个Server节点同步失败,才会同步第二个节点,以此类推。 从DiscoveryClient#fetchRegistry能够看到,同步数据有两个办法(1)全量同步由DiscoveryClient#getAndStoreFullRegistry办法实现,通过Http Get调用Server接口apps/,获取Server节点中所有服务注册信息替换DiscoveryClient#localRegionApps 留神:Client申请Server端的服务,都是通过EurekaHttpClient接口发动,该接口实现类EurekaHttpClientDecorator通过RequestExecutor接口将申请委托给其余EurekaHttpClient实现类,并提供execute办法给子类实现扩大解决(该扩大解决能够针对每一个EurekaHttpClient办法,相似AOP)。子类RetryableEurekaHttpClient#execute中,会获取eureka.client.service-url.defaultZone中配置的地址,通过TransportClientFactory#newClient,结构一个RestTemplateTransportClientFactory,再真正发动申请。 (2)增量同步由DiscoveryClient#getAndUpdateDelta办法实现,通过Http Get调用Server接口apps/delta,获取最新ADDED、MODIFIED,DELETED操作,更新本地缓存。如果获取最新操作失败,则会发动全量同步。 配置:eureka.client.fetch-registry,是否定时同步信息,默认trueeureka.client.registry-fetch-interval-seconds,距离多少秒同步一次服务注册信息,默认30 心跳HeartbeatThread -> DiscoveryClient#renew -> EurekaHttpClient#sendHeartBeat通过Http Put调用Server接口apps/{appName}/{instanceId}appName是服务的spring.application.name,instanceId是服务IP加服务端口。 留神:如果Server返回NOT_FOUND状态,则从新注册。 配置:eureka.client.register-with-eureka,以后利用是否注册到Eureka集群,默认trueeureka.instance.lease-renewal-interval-in-seconds,距离多少秒发送一次心跳,默认30 注册DiscoveryClient#构造函数 -> DiscoveryClient#register通过Http Post调用Server接口apps/{appName},发送以后利用的注册信息到Server。配置:eureka.client.register-with-eureka,以后利用是否注册到Eureka集群,默认trueeureka.client.should-enforce-registration-at-init,是否在初始化时注册,默认false InstanceInfoReplicatorInstanceInfoReplicator工作会去监测利用本身的IP信息以及配置信息是否产生扭转,如果产生扭转,则会从新发动注册。配置:eureka.client.initial-instance-info-replication-interval-seconds,距离多少秒查看一次本身信息,默认40 下线EurekaClientAutoConfiguration配置了CloudEurekaClient的销毁办法 @Bean(destroyMethod = "shutdown")DiscoveryClient#shutdown办法实现下线的解决工作,包含勾销定时工作,调用unregister办法(通过Http Delete调用Server接口apps/{appName}/{id}),勾销监控工作等 Eureka Server@EnableEurekaServer引入EurekaServerMarkerConfiguration,EurekaServerMarkerConfiguration构建EurekaServerMarkerConfiguration.Marker。EurekaServerAutoConfiguration会在Spring上下文中存在EurekaServerMarkerConfiguration.Marker时失效,结构Server端组件类。 Eureka Server也要应用DiscoveryClient,拉取其余Server节点的服务注册信息或者将本身注册到Eureka集群中。 启动同步Server启动时,须要从相邻Server节点获取服务注册信息,同步到本身内存。 Server的服务注册信息寄存在AbstractInstanceRegistry#registry变量中,类型为ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>>。外层Map Key为appName,外层Map Key为instanceId,Lease代表Client与Server之间维持的一个契约。InstanceInfo保留具体的服务注册信息,如instanceId,appName,ipAddr,port等。 EurekaServerBootstrap是Server端的启动疏导类,EurekaServerInitializerConfiguration实现了Lifecycle接口,start办法调用eurekaServerBootstrap.contextInitialized实现Server端初始化。eurekaServerBootstrap.contextInitialized -> EurekaServerBootstrap#initEurekaServerContext -> PeerAwareInstanceRegistryImpl#syncUp -> AbstractInstanceRegistry#registerPeerAwareInstanceRegistryImpl#syncUp调用DiscoveryClient#getApplications办法,获取相邻server节点的所有服务注册信息,再调用AbstractInstanceRegistry#register办法,注册到AbstractInstanceRegistry#registry变量中。 ...

September 19, 2020 · 2 min · jiezi

关于springcloud:架构设计-基于Seata中间件微服务模式下事务管理

源码地址:GitHub·点这里 || GitEE·点这里 一、Seata简介1、Seata组件Seata是一款开源的分布式事务解决方案,致力于提供高性能和简略易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA、XA事务模式,为用户打造一站式的分布式解决方案。 2、反对模式AT 模式 基于反对本地 ACID 事务的关系型数据库。Java利用,通过 JDBC 拜访数据库。一阶段:业务数据和回滚日志记录在同一个本地事务中提交,开释本地锁和连贯资源。 二阶段:提交异步化,十分疾速地实现。回滚通过一阶段的回滚日志进行反向弥补。 TCC模式 一个分布式的全局事务,整体是两阶段提交的模型,全局事务是由若干分支事务组成的,分支事务要满足两阶段提交的模型要求,即须要每个分支事务都具备本人的: 一阶段 prepare 行为 二阶段 commit 或 rollback 行为 Saga模式 Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当呈现某一个参与者失败则弥补后面曾经胜利的参与者,一阶段正向服务和二阶段弥补服务都由业务开发实现。 XA模式 XA是一个分布式事务协定,对业务无侵入的分布式事务解决方案,XA提交协定须要事务参与者的数据库反对,XA事务具备强一致性,在两阶段提交的整个过程中,始终会持有资源的锁,性能不现实的毛病很显著。 二、服务端部署1、下载组件包1.2版本:seata-server-1.2.0.zip 解压目录 bin:寄存服务端运行启动脚本;lib:寄存服务端依赖的资源jar包;conf:配置文件目录。2、批改配置file.conf配置 mode:db 即应用数据库存储事务信息,这里还能够抉择file存储形式。 file模式为单机模式,全局事务会话信息内存中读写并长久化本地文件root.data,性能较高; db模式为高可用模式,全局事务会话信息通过db共享,相应性能差些; redis模式Seata-Server 1.3及以上版本反对,性能较高,存在事务信息失落危险,请提前配置适合以后场景的redis长久化配置. store { ## store mode: file、db mode = "db" db { datasource = "druid" dbType = "mysql" driverClassName = "com.mysql.jdbc.Driver" url = "jdbc:mysql://127.0.0.1:3306/seata_server" user = "root" password = "123456" minConn = 5 maxConn = 30 globalTable = "global_table" branchTable = "branch_table" lockTable = "lock_table" queryLimit = 100 maxWait = 5000 }}registry.conf配置 ...

September 14, 2020 · 2 min · jiezi

关于springcloud:SpringCloud源码解析-Spring-Cloud-Sleuth原理探究

本文分享spring cloud sleuth如何构建申请调用链路,并上报zipkin。如果大家在应用spring cloud sleuth时遇到traceId失落,上报zipkin失败等问题,心愿本文能够给大家一个思路。源码剖析基于Spring Cloud Hoxton,Spring Cloud Sleuth版本为2.2.0.RELEASE 首先明确几个概念Span:一个工作单元,比方一次RPC(Http)申请过程,其SpanId变量应用惟一的64位ID标识一个Span,Span还有其余数据,如形容,工夫戳,Annotation(tags)。Trace:一条申请调用链路组成的span汇合,相似于tree构造,同样,TraceId变量标识一个Trace。 Annotation:用于记录事件理论产生工夫,可用于zipkin统计和绘制报表。cs:Client Sent,客户端发动一个申请工夫sr:Server Received,服务端接管到申请工夫ss:Server Sent,服务端返回响应工夫cr:Client Received,客户端接管到响应工夫 SpringBoot 2开始应用了brave框架实现日志收集,brave是zipkin官网提供的java版本客户端,它将收集的跟踪信息,以Span的模式上报给Zipkin零碎。brave框架具体可见https://github.com/openzipkin...。 上面假如有client,server两个工程,调用链路如下:用户 -> client --> server 本文咱们来探讨以下几个问题 用户调用client时,client如何生成Span信息client调用server时,如何将Span发送到serverserver如何接管cliend的Span信息client,server如何发送Span到zipkin留神,本文是基于SpringMvc+RestTeamplate的申请调用的,而非WebFlux异步调用。 问题1问题1和问题3,都由LazyTracingFilter解决,它在TraceWebServletAutoConfiguration中初始化。 (本文局部源码来自于brave框架)LazyTracingFilter#doFilter -> (brave)TracingFilter#doFilter public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {... // #1 Span span = handler.handleReceive(new HttpServerRequest(httpRequest)); // #2 request.setAttribute(SpanCustomizer.class.getName(), span.customizer()); request.setAttribute(TraceContext.class.getName(), span.context()); Throwable error = null; // #3 Scope scope = currentTraceContext.newScope(span.context()); try { chain.doFilter(httpRequest, httpResponse); } ... finally { // #4 scope.close(); if (servlet.isAsync(httpRequest)) { // we don't have the actual response, handle later servlet.handleAsync(handler, httpRequest, httpResponse, span); } else { // we have a synchronous response, so we can finish the span handler.handleSend(servlet.httpServerResponse(httpRequest, httpResponse), error, span); } }}#1 从Http Request的Header里获取Span数据,如果Header中存在X-B3-TraceId,X-B3-SpanId,X-B3-ParentSpanId属性,就阐明调用链前一个节点曾经生成Span,并传递下来,这时能够间接应用这些Span数据。否则,创立一个新的Span。#2 记录一些Span的属性#3 调用ThreadLocalCurrentTraceContext#newScope,保留以后的Span信息,当利用向下传递Span信息时须要应用这些信息。这里会调用ThreadLocalCurrentTraceContext#decorateScope,它会获取上下文的ScopeDecorator,并触发其decorateScope办法。SleuthLogAutoConfiguration构建了默认的ScopeDecorator -- Slf4jScopeDecorator,它会获取Span中的traceId,parentId,spanId,搁置MDC中,不便日志打印。TraceAutoConfiguration负责构建ThreadLocalCurrentTraceContext,并将Slf4jScopeDecorator增加到ThreadLocalCurrentTraceContext#decorateScope中#4 敞开Scope,记录server finishTimestamp(ss)。 ...

September 12, 2020 · 2 min · jiezi

关于springcloud:SpringCloud源码解析-Zuul实现原理

本文次要分享Zuul的应用和原理。 因为工作须要,我第一个深刻理解的SpringCloud组件其实是Zuul,心愿这篇文章能说分明Zuul的相干实现原理。 Zuul通过ZuulFilter对申请进行拦挡,过滤,转发等操作。ZuulFilter也是提供给咱们扩大的接口。ZuulFilter有四种类型pre:在申请被路由之前调用,次要负责过滤,request申请解决等工作route:负责申请路由,转发工作post:负责发送响应到客户端error:下面流程产生谬误时被调用,做一些异样善后工作 Zuul的整体流程在ZuulServlet或ZuulServletFilter,这两个类性能根本一样,默认应用的是ZuulServlet,在ZuulServerAutoConfiguration初始化。ZuulServlet#service public void service(javax.servlet.ServletRequest servletRequest, javax.servlet.ServletResponse servletResponse) throws ServletException, IOException { try { init((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse); RequestContext context = RequestContext.getCurrentContext(); context.setZuulEngineRan(); try { preRoute(); } catch (ZuulException e) { error(e); postRoute(); return; } try { route(); } catch (ZuulException e) { error(e); postRoute(); return; } try { postRoute(); } catch (ZuulException e) { error(e); return; } } catch (Throwable e) { error(new ZuulException(e, 500, "UNHANDLED_EXCEPTION_" + e.getClass().getName())); } finally { RequestContext.getCurrentContext().unset(); }}整体流程如下 ...

September 12, 2020 · 3 min · jiezi

关于spring-cloud:spring-cloud

最好用的idea插件:JBLSpringBootAppGen

September 8, 2020 · 1 min · jiezi

关于springcloud:SpringCloudSpringCloudAlibaba学习笔记

服务注册核心eurekaap 高可用 分布式容错 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>eureka: instance: hostname: eureka7003.com #eureka服务端的实例名称 instance-id: payment8001 prefer-ip-address: true client: register-with-eureka: false #false示意不向注册核心注册本人。 fetch-registry: false #false示意本人端就是注册核心,我的职责就是保护服务实例,并不需要去检索服务 service-url: #集群指向其它eureka #defaultZone: http://eureka7002.com:7002/eureka/ #单机就是7001本人 defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/ #server: #敞开自我爱护机制,保障不可用服务被及时踢除 #enable-self-preservation: false #eviction-interval-timer-in-ms: 2000Ribbon 启用负载平衡@EnableEurekaServer@EnableDiscoveryClient@LoadBalancedpublic RestTemplate getTemp() { return new RestTemplate();}zookeppercp 强统一 分布式容错 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId> <exclusions> <exclusion> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> </exclusion> </exclusions></dependency><dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.6.1</version></dependency>spring: application: name: cloud-zoo-consumer-order cloud: zookeeper: connect-string: 192.168.10.58:2181@SpringBootApplication@EnableDiscoveryClientconsulcp 强统一 分布式容错 ...

August 25, 2020 · 4 min · jiezi

关于spring-cloud:spring-cloud-gatewayribbon-组合指定版本权重分流简易灰度发布实现

0.参考文章1 ribbon中应用HystrixRequestVariableDefault的一个注意事项 文章2 SpringCloud灰度公布实际(附源码) zuul实现的能够参考。 1.思路革新gataway的### Weight Route Predicate Factory,在指定权重的同时指定每个对应权重的服务的版本号。次要须要改写的中央是要在分流之后,将版本号传给ribbon,ribbon在做负载平衡抉择的时候,依据传入的版本号,与服务的eureka.matedata中的version匹配,从而达到灰度公布的目标。gateway的配置相似如下,VersionWeight为重写的断言工厂。 - id: temp_old uri: lb://TEMPLATE predicates: - Path=/temp/** - VersionWeight=group1, 10, v1 filters: - StripPrefix=1 - id: temp_new uri: lb://TEMPLATE predicates: - Path=/temp/** - VersionWeight=group1, 1, v2 filters: - StripPrefix=12.考察革新点debug后晓得了整个申请程序 客户端-> gateway filter -> LoadBalancerClientFilter -> (如果应用ribbon) RibbonLoadBalancerClient-> (某个Rule) XXXAvoidanceRule -> (对应的 Predicate) XXXAvoidancePredicate所以抉择的服务的要害就是Ribbon的rule和Predicate 步骤 写一个grayContext, 基于threadlocal解决version的上下文传递。自定义负载策略:负载策略的要害是Rule 和 Predicate, Rule 继承 PredicateBasedRule, Predicate 继承 AbstractServerPredicate, 实现Predicate 中的 apply办法 此办法是负载策略外围(逻辑:从grayContext获取version,与服务的eureka.matedata中的version匹配。匹配上则为指标服务)改写权重断言策略:改写WeightRoutePredicateFactory,在Factory 分流实现后,把路由中配置的 version 放入到grayContext 中。并且要将vesion 放入到 request的head中,用来向下传递。下面是对gateway的革新,通过革新后,gateway散发的时候就依据version能指定申请的服务器,接下来是微服务间通过fegin或者restTemplate调用时的革新,目标是将version持续往下传递 ...

August 19, 2020 · 1 min · jiezi

关于springcloud:Spring-Cloud微服务实战

Spring Cloud微服务实战 下载地址: https://pan.baidu.com/s/1GThtjsNrcakbVD8gyY0x0Q 扫码上面二维码关注公众号回复100016 获取分享码 本书目录构造如下: 第1章基础知识............................................................. 1 什么是微服务架构.......................................................... 1 与单体零碎的区别.......................................................... I 如何施行微服务.............................................................2 为什么抉择Spring Cloud ................................................. 6 Sp门ng Cloud简介.........................................................7 版本阐明·································································8 第2章微服务构建: Spring Boot... ....................................... 11 框架简介................................................................ 12 疾速入r'l .............................................................. 13 我的项目构建与解析..............................................。。。。。... 13 实现RESTful API ........................................................ 17 自定义参数...............................................................22 命令行参数...............................................................23 第3章服务治理: Spring Cloud Eureka .............................................................................. 39 月屈务治理......................................................................................................................................39 Netflix Eureka 40 搭建服务压册核心 41 注册服务提供者..................................................................................................................43 高可用注册核心 46 服务发现与生产 48 Eureka详解..................................................................................................................................51 基础架构..............................................................................................................................52 服务治理机制......................................................................................................................52 源码剖析······························································································································56 配置详解 65 服务汪册类配置 65 服务实例类配置..................................................................................................................67 跨平台反对..................................................................................................................................71 第4章 客户端负载平衡: Spring Cloud Ribbon ................................................................... 73 客户端负载平衡..........................................................................................................................73 RestTemplate详解.......................................................................................................................75 GET申请.............................................................................................................................75 POST申请...........................................................................................................................77 PUT申请..............................................................................................................................79 DELETE申请......................................................................................................................79 第7章 API网关服务: Spring Cloud Zuul ......................................................................... 217 疾速入11 .................................................................................................................................... 219 构建网关............................................................................................................................220 申请路由 .................................221 申请过滤 .................................223 路由详解 .................................226 传统路由配置 .................................226 服务路由配置................................. 228 服务路由的默认规定 .................................229 自定义路由映射规定........................................................................................................229 二: ::: 本地跳转............................................................................................................................234 Cookie与头信息...................................................................................................235 Hystr    ................................................................................................... 235 ix和Ribbo? 反对.................................................................. 236 过滤器详解 ..................................................................238 过滤器 ...................................................................................................238 申请生命周期....................................................................................................................239 外围过滤器 ....................................................................................................................................240 ...

August 13, 2020 · 1 min · jiezi

关于spring-cloud:Spring-Cloud微服务全栈技术与案例解析

Spring Cloud微服务全栈技术与案例解析 下载地址: https://pan.baidu.com/s/1NJmgFlQmNmFG2RkrYO7Q7Q 扫码上面二维码关注公众号回复100017 获取分享码 本书目录构造如下: Spring Cloud与微服务概述… ··2 1.1 传统的单体利用………………… ··2 1.1.1 改良 利用的架构………… 1.1.2 务聚拢 ……………… ·3 1.2 什么是微服务…………………… ·4 1.2.l 用微 务架构的劣势和 劣势 ……..... ...... .. ... ... 4 1.2.2 重构前的筹备工作…………… 1.3 什么是 Spring Cloud ……………… 5 1.3.l Spring oud 块介绍……… ·5 1.3.2 Spring Cloud 版本 ……… ·6 1.4 本章小结…. ...... ..……… ·······7 章实战前的筹备工作………… 2.1 开发环境的筹备………………… 8 2.2 Spring Boot 人门 …… …………… ··9 ...

August 12, 2020 · 7 min · jiezi

关于spring-cloud:Spring-Cloud系列之微服务介绍

置信我,请认真读完,点开每一个链接,或者你能力真正理解什么是微服务?什么是分布式?什么是云计算?相对没有多余! 1 微服务微服务架构是“新常态”。构建小型的、自蕴含的、随时能够运行的应用程序能够为代码带来极大的灵活性和灵活性。spring boot的许多专门构建的个性使得在大规模生产中构建和运行微服务变得非常容易。别忘了,没有spring cloud,就没有一个微服务架构是残缺的,它简化了治理,加强了您的容错能力。 1.1 什么是微服务?微服务是一种古代的软件办法,利用程序代码能够独立于其余程序以可治理的小块模式交付。 1.2 为什么要构建微服务?它们的小规模和绝对隔离能够带来许多额定的益处,例如更容易保护、进步生产力、更大的容错能力、更好的业务协调等等。 2 Spring Cloud开发分布式系统可能具备挑战性。复杂性从应用层转移到网络层,要求服务之间进行更大的交互。使您的代码成为“本机云”意味着要解决12个因素的问题,例如内部配置、无状态状态、日志记录和连贯到反对服务。spring cloud我的项目套件蕴含许多使应用程序在云中运行所需的服务。 2.1 Service discovery——服务发现在云中,应用程序不可能总是晓得其余服务的确切地位。服务注册核心(如Netflix Eureka)或sidecar解决方案(如HashiCorp consur)都能够提供帮忙。spring cloud为风行的注册核心提供了Discovery Client实现,比方Eureka、consur、Zookeeper,甚至Kubernetes的内置零碎。还有一个spring cloud负载平衡器(Spring Cloud LoadBalancer),能够帮忙您在服务实例之间小心地调配负载。 2.2 API gateway——API 网关因为有如此多的客户机和服务器,在您的云架构中蕴含一个API网关通常是很有帮忙的。网关能够负责爱护和路由音讯、暗藏服务、限度负载以及许多其余有用的事件。spring cloud gateway为您提供了对API层的准确管制,集成了spring cloud服务发现和客户端负载平衡解决方案,以简化配置和保护。 2.3 Cloud configuration——云配置在云中,配置不能简略地嵌入到应用程序中。配置必须足够灵便,以应答多个应用程序、环境和服务实例,并在不停机的状况下解决动态变化。spring cloud config旨在加重这些累赘,并提供与Git等版本控制系统的集成,以帮忙您确保配置的平安。 2.4 Circuit breakers——断路器分布式系统可能不牢靠。申请可能会遇到超时或齐全失败。断路器能够帮忙缓解这些问题,spring cloud断路器为您提供了三种风行的抉择:Resilience4J、Sentinel或Hystrix。 2.5 Tracing——追踪调试分布式应用程序可能很简单,而且须要很长时间。对于任何给定的失败,您可能须要将来自多个独立服务的信息跟踪拼凑在一起。spring cloud sleuth能够以一种可预测和可反复的形式为您的利用程序安装工具。当与Zipkin联合应用时,您能够将注意力集中在任何可能存在的提早问题上。 2.6 Testing——测试在云计算中,领有牢靠、可信、稳固的api能够取得额定的分数,但要实现这一指标还须要一段旅程。基于契约的测试是高绩效团队常常应用的一种技术。它有助于规范化api的内容,并围绕它们构建测试,以确保代码始终处于查看状态。spring cloud contract通过应用Groovy、Java或Kotlin编写的契约,为REST和基于消息传递的api提供基于契约的测试反对。 3 流数据spring cloud stream使得应用和生成事件变得非常容易,无论您抉择哪个消息传递平台。spring cloud stream只需几行代码就能够将您的微服务与实时消息传递连接起来,以帮忙您构建高度可伸缩、事件驱动的零碎。Get started with Spring Cloud Stream 4 治理微服务spring boot的可选仪器框架microller间接将度量发送给Prometheus、Atlas等,以提供有价值的见解。spring cloud的Sleuth和Zipkin我的项目补充了这一点,它们提供了分布式跟踪,以便您可能实时跟踪正在产生的事件。Get started with Micrometer on Spring Boot ...

August 9, 2020 · 1 min · jiezi

关于springcloud:SpringCloud-alibaba实战系列文章汇总

个人感觉这是全网比拟齐全,写的比拟好的SpringCloud alibaba系列教程了,举荐给大家! SpringCloud Alibaba微服务实战一 - 根底环境筹备SpringCloud Alibaba微服务实战二 - 服务注册SpringCloud Alibaba微服务实战三 - 服务调用SpringCloud Alibaba微服务实战四 - 版本治理SpringCloud Alibaba微服务实战五 - 限流熔断SpringCloud Alibaba微服务实战六 - 配置隔离SpringCloud Alibaba微服务实战七 - 分布式事务SpringCloud Alibaba微服务实战八 - Seata 整合NacosSpringCloud Alibaba微服务实战九 - Seata 容器化SpringCloud Alibaba微服务实战十 - 服务网关SpringCloud Alibaba微服务实战十一 - Swagger接口文档聚合SpringCloud Alibaba微服务实战十二 - 网关限流SpringCloud Alibaba微服务实战十三 - Oauth2.0平安认证SpringCloud Alibaba微服务实战十四 - SpringCloud Gateway集成Oauth2.0SpringCloud Alibaba微服务实战十五 - SpringCloud 容器化部署SpringCloud Alibaba微服务实战十六 - 2.2.1.RELEASE版本升级SpringCloud Alibaba微服务实战十七 - JWT认证SpringCloud Alibaba微服务实战十八 - Oauth2.0 自定义受权模式SpringCloud Alibaba微服务实战十九 - 集成RBAC受权SpringCloud Alibaba微服务番外篇一 - Swagger自定义主动配置SpringCloud Alibaba微服务番外篇二 - Feign传递Access_Token ...

August 7, 2020 · 1 min · jiezi

关于springcloud:SpringCloud微服务基于Nacos组件整合Dubbo框架

源码地址:GitHub·点这里 || GitEE·点这里 一、根底组件简介1、Dubbo框架Dubbo服务化治理的外围框架,之前几年在国内被宽泛应用,后续因为微服务的架构的崛起,更多的公司转向微服务下成熟的技术栈,然而Dubbo自身的确是十分优良的框架。 常见的利用迭代和降级的过程根本如下: 当利用访问量逐步增大,繁多利用减少机器带来的加速度越来越小,晋升效率的办法之一是将利用拆成互不相干的几个利用,以晋升效率。此时,用于减速前端页面开发的Web框架(MVC)是要害。随着垂直利用越来越多,利用之间交互不可避免,将外围业务抽取进去,作为独立的服务,逐步造成稳固的服务中心,使前端利用能更疾速的响应多变的市场需求。此时,用于进步业务复用及整合的分布式服务框架(RPC)是要害。随同业务倒退,服务越来越多,容量的评估,小服务资源的节约等问题逐步浮现,此时需减少一个调度核心基于拜访压力实时治理集群容量,进步集群利用率。此时,用于进步机器利用率的资源调度和治理核心(SOA)是要害。 而Dubbo框架的外围能力:面向接口的近程办法调用,智能容错和负载平衡,以及服务主动注册和发现。正好能够解决上述业务倒退的痛点。 2、微服务框架SpringCloud是一系列框架的有序汇合。它利用SpringBoot的开发便利性奇妙地简化了分布式系统基础设施的开发,如服务发现注册、配置核心、音讯总线、负载平衡、断路器、数据监控等,都能够用SpringBoot的开发格调做到一键启动和部署。 后续AliCloud微服务系列组件也一直被应用起来,其中最根底的组件Nacos注册核心,更是间接反对Dubbo框架,这样Cloud和Dubbo两大框架就胜利的整合在了一起。 3、Nacos注册核心Nacos注册核心次要用于发现、配置、治理微服务。并且提供一组简略易用的个性集,疾速实现动静服务发现、服务配置、服务元数据及流量治理。 如上图Nacos无缝反对一些支流的开源生态框架,例如SprinCloud,Dubbo两大框架。在AliCloud的系列组件中,还蕴含了Seata,RocketMQ,Sentinel等一系列组件。 二、服务构造图解SpringCloud和Dubbo整合的构造示意图如下,应用的Nacos核心: Provider提供方:提供外围的Dubbo服务接口; Consumer生产方:生产注册的Dubbo服务接口; Nacos注册核心:配置、发现和治理Dubbo服务; 通过上述流程不难发现,不论从架构上看,还是用法过程,基于外围Dubbo框架和微服务原生框架是十分相似,上述流程也遵循这样一个规定:dubbo-server连贯本人的业务库DB,并通过dubbo-facade中接口向外提供服务,如果不同dubbo-server须要拜访其余服务接口,也必须要通过其余服务的facade接口操作,dubbo-client作为接口服务生产端,能够通过facade接口拜访很多业务模块的服务,整体架构档次非常明了。 三、编码案例实现1、案例构造和依赖案例构造 蕴含三个模块:server、facade、client。 外围依赖 <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> <version>2.1.1.RELEASE</version></dependency><dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.1.1.RELEASE</version></dependency><dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2.1.1.RELEASE</version></dependency>2、服务端配置配置文件 次要是Nacos注册核心和Dubbo两个外围配置。 server: port: 9010spring: application: name: node10-dubbo-server cloud: nacos: discovery: server-addr: http://localhost:8848 config: server-addr: http://localhost:8848 file-extension: yaml# Dubbo服务配置dubbo: scan: base-packages: com.cloud.dubbo.service protocol: name: dubbo port: -1 registry: address: spring-cloud://localhost服务接口实现 这里DubboService即dubbo-facade包中对外提供的接口。 import org.apache.dubbo.config.annotation.Service;import org.slf4j.Logger;import org.slf4j.LoggerFactory;@Servicepublic class DubboServiceImpl implements DubboService { private static final Logger LOGGER = LoggerFactory.getLogger(DubboServiceImpl.class) ; @Override public String getInfo() { LOGGER.info("node10-dubbo-server start ..."); return "node10-dubbo-server"; }}留神:@Service是Dubbo框架中的注解,不是Spring框架的注解。 ...

August 5, 2020 · 1 min · jiezi

关于springcloud:SpringCloud微服务基于Nacos组件整合Dubbo框架

源码地址:GitHub·点这里 || GitEE·点这里 一、根底组件简介1、Dubbo框架Dubbo服务化治理的外围框架,之前几年在国内被宽泛应用,后续因为微服务的架构的崛起,更多的公司转向微服务下成熟的技术栈,然而Dubbo自身的确是十分优良的框架。 常见的利用迭代和降级的过程根本如下: 当利用访问量逐步增大,繁多利用减少机器带来的加速度越来越小,晋升效率的办法之一是将利用拆成互不相干的几个利用,以晋升效率。此时,用于减速前端页面开发的Web框架(MVC)是要害。随着垂直利用越来越多,利用之间交互不可避免,将外围业务抽取进去,作为独立的服务,逐步造成稳固的服务中心,使前端利用能更疾速的响应多变的市场需求。此时,用于进步业务复用及整合的分布式服务框架(RPC)是要害。随同业务倒退,服务越来越多,容量的评估,小服务资源的节约等问题逐步浮现,此时需减少一个调度核心基于拜访压力实时治理集群容量,进步集群利用率。此时,用于进步机器利用率的资源调度和治理核心(SOA)是要害。 而Dubbo框架的外围能力:面向接口的近程办法调用,智能容错和负载平衡,以及服务主动注册和发现。正好能够解决上述业务倒退的痛点。 2、微服务框架SpringCloud是一系列框架的有序汇合。它利用SpringBoot的开发便利性奇妙地简化了分布式系统基础设施的开发,如服务发现注册、配置核心、音讯总线、负载平衡、断路器、数据监控等,都能够用SpringBoot的开发格调做到一键启动和部署。 后续AliCloud微服务系列组件也一直被应用起来,其中最根底的组件Nacos注册核心,更是间接反对Dubbo框架,这样Cloud和Dubbo两大框架就胜利的整合在了一起。 3、Nacos注册核心Nacos注册核心次要用于发现、配置、治理微服务。并且提供一组简略易用的个性集,疾速实现动静服务发现、服务配置、服务元数据及流量治理。 如上图Nacos无缝反对一些支流的开源生态框架,例如SprinCloud,Dubbo两大框架。在AliCloud的系列组件中,还蕴含了Seata,RocketMQ,Sentinel等一系列组件。 二、服务构造图解SpringCloud和Dubbo整合的构造示意图如下,应用的Nacos核心: Provider提供方:提供外围的Dubbo服务接口; Consumer生产方:生产注册的Dubbo服务接口; Nacos注册核心:配置、发现和治理Dubbo服务; 通过上述流程不难发现,不论从架构上看,还是用法过程,基于外围Dubbo框架和微服务原生框架是十分相似,上述流程也遵循这样一个规定:dubbo-server连贯本人的业务库DB,并通过dubbo-facade中接口向外提供服务,如果不同dubbo-server须要拜访其余服务接口,也必须要通过其余服务的facade接口操作,dubbo-client作为接口服务生产端,能够通过facade接口拜访很多业务模块的服务,整体架构档次非常明了。 三、编码案例实现1、案例构造和依赖案例构造 蕴含三个模块:server、facade、client。 外围依赖 <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> <version>2.1.1.RELEASE</version></dependency><dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.1.1.RELEASE</version></dependency><dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2.1.1.RELEASE</version></dependency>2、服务端配置配置文件 次要是Nacos注册核心和Dubbo两个外围配置。 server: port: 9010spring: application: name: node10-dubbo-server cloud: nacos: discovery: server-addr: http://localhost:8848 config: server-addr: http://localhost:8848 file-extension: yaml# Dubbo服务配置dubbo: scan: base-packages: com.cloud.dubbo.service protocol: name: dubbo port: -1 registry: address: spring-cloud://localhost服务接口实现 这里DubboService即dubbo-facade包中对外提供的接口。 import org.apache.dubbo.config.annotation.Service;import org.slf4j.Logger;import org.slf4j.LoggerFactory;@Servicepublic class DubboServiceImpl implements DubboService { private static final Logger LOGGER = LoggerFactory.getLogger(DubboServiceImpl.class) ; @Override public String getInfo() { LOGGER.info("node10-dubbo-server start ..."); return "node10-dubbo-server"; }}留神:@Service是Dubbo框架中的注解,不是Spring框架的注解。 ...

August 5, 2020 · 1 min · jiezi

关于springcloud:使用springcloud-alibaba搭建的微服务系统

1.git仓库地址https://gitee.com/QingXinDeChengXuYuan/xiayuedu.git2.阐明注册核心及配置核心应用nacos网关应用springcloud gateway服务调用应用 openfeignxiayu-admin-gateway 后盾治理网关次要负责后盾接口,管理员token生成等等逻辑同公共网关xiayu-common 专用模块:次要是工具类,配置类等等redis采纳哨兵模式,并且创立缓存管理器,redisson客户端kafka 音讯确认形式应用all,音讯幂等性通过数据库进行确认数据库应用一主一从国际化,主动注入MessageSource即可权限管制应用spring security,权限信息存储在token,基于角色信息管制权限分布式id应用雪花算法每个服务的nodeId,应用zookeeper的长期程序节点可依据配置文件项,设置开启与敞开每次申请的traceId通过以后线程局部变量+1封装CommonResponse、CommonRequest和异样加密工具类xiayu-integration 发送短信,邮件服务 //todoxiayu-job 定时工作服务定义了定时工作模版,每个定时工作须要分布式锁xiayu-public-gateway 用户网关服务网关服务次要对token进行签发,签发之后会保留到redis中,签发是通过注册或登录接口返回response的值进行判断的token验证,首先查看redis中是否存在每次申请,验证token并更新过期工夫xiayu-user 用户服务用户注册登录,角色权限依照需要能够额定增加服务

August 5, 2020 · 1 min · jiezi

关于springcloud:使用springcloud-alibaba搭建的微服务系统

1.git仓库地址https://gitee.com/QingXinDeChengXuYuan/xiayuedu.git2.阐明注册核心及配置核心应用nacos网关应用springcloud gateway服务调用应用 openfeignxiayu-admin-gateway 后盾治理网关次要负责后盾接口,管理员token生成等等逻辑同公共网关xiayu-common 专用模块:次要是工具类,配置类等等redis采纳哨兵模式,并且创立缓存管理器,redisson客户端kafka 音讯确认形式应用all,音讯幂等性通过数据库进行确认数据库应用一主一从国际化,主动注入MessageSource即可权限管制应用spring security,权限信息存储在token,基于角色信息管制权限分布式id应用雪花算法每个服务的nodeId,应用zookeeper的长期程序节点可依据配置文件项,设置开启与敞开每次申请的traceId通过以后线程局部变量+1封装CommonResponse、CommonRequest和异样加密工具类xiayu-integration 发送短信,邮件服务 //todoxiayu-job 定时工作服务定义了定时工作模版,每个定时工作须要分布式锁xiayu-public-gateway 用户网关服务网关服务次要对token进行签发,签发之后会保留到redis中,签发是通过注册或登录接口返回response的值进行判断的token验证,首先查看redis中是否存在每次申请,验证token并更新过期工夫xiayu-user 用户服务用户注册登录,角色权限依照需要能够额定增加服务

August 5, 2020 · 1 min · jiezi

关于springcloud:SpringCloud-应用在-Kubernetes-上的最佳实践-线上发布可回滚

简介: 本篇是《SpringCloud 利用在 Kubernetes 上的最佳实际》系列文章的第七篇,次要介绍了新性能上线时,如何尽快缩小对线上用户的影响?公布零碎须要提供回滚到前一个或前几个版本的能力,达到疾速复原线上业务的目标。 通常一次利用的线上公布就示意了一次新性能的上线。在上线过程中,可能产生一些非预期的状况,如新版本软件有bug,或者性能不达预期,就会影响了线上客户的应用。 为了尽快缩小对线上用户的影响,公布零碎须要提供回滚到前一个或前几个版本的能力。达到疾速复原线上业务的目标。 从利用的部署变更档次来看,能够分为以下三层: 所以对应了以下的回滚场景: 回滚利用内的配置,实用于因为利用配置变更导致的问题。此时如果利用可能实现动静的配置加载,通过回滚配置就能实现业务复原的目标。否则须要重启利用回滚利用代码的版本,实用于代码批改导致的问题。此时须要回滚代码的版本(镜像),重启利用。回滚利用的工作负载与运维配置(基础设施层)。利用内配置回滚利用内的配置通常与利用零碎须要或业务逻辑配置无关,如配置数据库的连贯信息,业务规定配置等,配置的变更也很容易造成线上零碎的问题,个别的做法是通过configmap或properties配置文件来实现,这种状况下很难做到动静推送和回滚的能力,因为回滚须要保留不同版本的配置。 通过 散布配置管理(ACM)(EDAS默认反对)很容易实现配置的集中管理,回滚和灰度,分布式推送,审计等性能。能够在ACM或EDAS的管制台上实现一键回滚,如下图所示: 利用代码回滚Deployment是一种常见部署的利用的workload,回滚代码其实对应了回滚对应代码版本的镜像,其实就是对应就是Deployment的回滚,Kubernetes能够通过以下形式反对Deployment的回滚。 Deployment回滚在一个规范的 Kubernetes 体系下,如果呈现新版本的pod不能失常工作,须要将deployment回滚到历史版本,Kubernetes 提供了原生的反对;其原理是在默认状况下,kubernetes 会将历史记录保留在零碎中,间接应用应用 rollout 命令回滚即可,如下:。 回滚到上一个版本kubectl rollout undo deployment.v1.apps/{deployment.name}回滚到指定的版本 能够通过kubectl rollout history查看历史的版本kubectl rollout history deployment.v1.apps/{deployment.name}能够通过以下命令回滚到指定的版本kubectl rollout undo deployment.v1.apps/{deployment.name} --to-revision={version}EDAS中利用回滚而在 EDAS 中,联合了原生的能力做了更丰盛的白屏的体验,咱们就公布过程中和公布实现后两个场景别离形容。 公布过程中回滚公布过程中回滚是指在利用公布过程中,就发现了问题,须要将利用回滚到前一个版本。此时的操作就是中断公布流程,将曾经降级实现后或正在降级的服务器回滚到前一个版本。 EDAS在每次变更时候,能够间接中断公布流程,一键回滚。如下图所示: 另外,EDAS公布零碎提供单批,分批,金丝雀灰度等多种公布模式,在分批和金丝雀灰度的公布的时候,EDAS还提供不同批次的监控信息,如零碎指标,利用指标,利用异样检测等能力,提供疾速发现问题能力,如果存在问题,能够立刻进行回滚。如下图所示: 咱们举荐的形式也是在公布过程中尽量应用分批和金丝雀的能力,以将公布引起的不可用降至最小。 公布实现后回滚公布后回滚是指一次部署过程曾经实现,蕴含部署胜利或失败。这个时候,能够通过部署历史的版本来实现回滚的性能。EDAS 默认会存储最多十个部署过的版本,如下图所示: 通过以上的性能,基本上能够笼罩利用在上线过程中须要回滚的场景。缩小因为零碎公布出问题,造成零碎性能应用上的影响。 利用主动回滚从下面的介绍,能够看到回滚的操作都是人工进行的,其实在一些场景里,能够依据一些监控指标,如CPU,load,内存等维度,疾速发现问题,就能做到主动回滚,能够可能更快地复原零碎。在 Kubernetes 的体系中,Flagger(https://github.com/weaveworks/flagger) 就是可能实现主动回滚的一个很好的工具。 利用工作负载和运维配置回滚下面介绍了利用内配置和利用代码回滚的形式,在常见的变更中,还存在工作负载及运维配置的变更,如更改工作负载的类型,变更JVM参数,日志配置, 弹性伸缩等。其中JVM参数等通常能够随Deployment进行回滚,然而相似Kubernetes service,日志,弹性伸缩规定等这些基础设施和运维相干的能力回滚就很难做到了。须要将利用的代码,工作负载,运维配置等实现配置化来实现回滚的能力。 这里举荐阿里巴巴与微软联结提出的OAM(Open Application Model)的标准,他定义了利用的对立交付模型. 在OMA中,一个应用程序蕴含以下几个外围的理念: Component: 是指利用中的组件,能够是利用运行所依赖的服务如MySQL数据库等,也能够是利用的自身,如Spring cloud的服务提供者。能够通过Component的定义标准来编写一个组件。Trait:是指利用的运维特色,形容了利用部署在具体环境中的运维特色,比方弹性伸缩规定和Ingress配置等,这些运维特色会利用到具体的组件上。Applicationconfiguration:是将Components和traits组装成一个真正能运行起来利用的定义。这个配置文件就是OAM标准中的一个申明式是API,通过它就能实例化出对应的,实在运行的利用。一个OAM的利用例子如下: apiVersion: core.oam.dev/v1alpha2kind: ApplicationConfigurationmetadata: name: springcloud-provider-deployment annotations: version: v1.0.0 description: "Description of this deployment"spec: components: - componentName: springcloud-provider-component parameterValues: - name: PARAMETER_NAME value: SUPPLIED_VALUE - name: ANOTHER_PARAMETER value: "AnotherValue" traits: - name: manualscaler.core.oam.dev version: v1 spec: replicaCount: 3 scopes: - scopeRef: apiVersion: core.oam.dev/v1alpha2 kind: NetworkScope name: example-vpc-network通过OAM的ApplicationConfiguration这份配置,就能形容线上真正运行的利用,结合能将配置版本化的零碎,如Git,ACM等,采纳对应的ApplicationConfiguration的版本,就能实现利用的一键回滚。EDAS里就是通过OAM标准来治理Kubernetes的利用,联合OAM申明式API的形式,EDAS里将会实现多种利用回滚的场景,为线上业务保驾护航。 ...

August 4, 2020 · 1 min · jiezi

关于springcloud:基于SpringCloud的enum枚举值国际化处理实践

背景选用SpringCloud框架搭建微服务做业务后盾利用时,会波及到大量的业务状态值定义,个别惯例做法是: 长久层(数据库)存储int类型的值后盾零碎里用浏览性好一点儿的常量将int类型的值做一层映射前端(app或浏览器)同样定义一套常量去映射这些关系前端调用后盾零碎的接口时,应用常量定义的int类型进行提交源于长久层存储的优化规定,int类型要比varchar类型效率高很多,这套做法也是大家接受度十分高的。 只是这里有一个不是很不便的中央:状态值映射的常量定义波及前端和后盾两局部,沟通的老本是一方面,另外如果状态值有变动,须要两组人员同时批改。 预期指标在保障长久层的int类型存储状态值的前提下,次要是思考业务状态的可浏览性问题和多处批改的问题,可浏览性问题一部分能够通过前后端人员定义常量来解决,但接口调试时还是间接应用int类型,这部分的可浏览性问题还是存在,多处批改的问题须要重点解决。 本篇举荐的计划: 长久层(数据库)存储没用原先的int类型值,这点放弃不变后盾零碎应用enum定义业务状态,不同的业务状态集能够由多个enum来实现,enum反对国际化前端展现enum国际化的文本内容前端调用后盾零碎接口时,应用enum国际化的文本内容进行提交后盾接管enum国际化的文本内容转换成int类型值,存储在数据库计划的长处: 长久层原有的设计,效率性问题不受影响业务状态的定义、映射全副内聚到后盾零碎,后续有状态值变动时,只需后盾做相应批改即可前端展现的内容,接口传输的内容均为浏览性更好的文本,并且反对国际化计划的毛病: 后盾零碎存储、读取状态值时,须要用enum进行转换通信传输的内容报文比原有的int类型大一点点计划实际实际原理此实际计划次要蕴含三局部: Enum类应用Jackson进行JSON序列化和反序列化Enum枚举项的messages国际化解决Enum的定义Enum自定义序列化和反序列化先定义Enum国际化类,自定义Enum的序列化和反序列化类,并应用注解@JsonSerialize、@JsonDeserialize注册到Spring的ObjectMapper中 @JsonDeserialize(using = DescEnumDeserializer.class)@JsonSerialize(using = DescEnumSerializer.class)public interface I18NEnum { /** * 获取枚举形容 * * @return */ String getDesc();}参考一下自定义的序列化实现: /** * @author huangying */public class DescEnumSerializer extends JsonSerializer<I18NEnum> { @Override public void serialize(I18NEnum value, JsonGenerator gen, SerializerProvider serializers) throws IOException { // 按类名+枚举值名称拼接配置文件key,全副大写解决 String key = value.getClass().getSimpleName() + "." + StringUtils.upperCase(value.toString()); // I18NUtil为国际化解决工具类 String data = I18NUtil.get(key, value.getDesc()); gen.writeString(data); }}自定义的反序列化实现: ...

July 31, 2020 · 2 min · jiezi

关于springcloud:Spring-Cloud1入门总结

Spring Cloud 入门总结看过的最棒的spring cloud入门简介文章首先我给大家看一张图,如果大家对这张图有些中央不太了解的话,我心愿你们看完我这篇文章会豁然开朗。 总体架构 什么是Spring cloud构建分布式系统不须要简单和容易出错。Spring Cloud 为最常见的分布式系统模式提供了一种简略且易于承受的编程模型,帮忙开发人员构建有弹性的、牢靠的、协调的应用程序。Spring Cloud 构建于 Spring Boot 之上,使得开发者很容易动手并疾速利用于生产中。官网果然官网,介绍都这么一板一眼的。 我所了解的 Spring Cloud 就是微服务零碎架构的一站式解决方案,在平时咱们构建微服务的过程中须要做如 服务发现注册 、配置核心 、音讯总线 、负载平衡 、断路器 、数据监控 等操作,而 Spring Cloud 为咱们提供了一套繁难的编程模型,使咱们能在 Spring Boot 的根底上轻松地实现微服务项目的构建。 Spring Cloud 的版本当然这个只是个题外话。 Spring Cloud 的版本号并不是咱们通常见的数字版本号,而是一些很奇怪的单词。这些单词均为英国伦敦地铁站的站名。同时依据字母表的程序来对应版本工夫程序,比方:最早 的 Release 版本 Angel,第二个 Release 版本 Brixton(英国地名),而后是 Camden、 Dalston、Edgware、Finchley、Greenwich、Hoxton。 Spring Cloud 的服务发现框架——EurekaEureka是基于REST(代表性状态转移)的服务,次要在AWS云中用于定位服务,以实现负载平衡和中间层服务器的故障转移。咱们称此服务为Eureka服务器。Eureka还带有一个基于Java的客户端组件Eureka Client,它使与服务的交互变得更加容易。客户端还具备一个内置的负载平衡器,能够执行根本的循环负载平衡。在Netflix,更简单的负载均衡器将Eureka包装起来,以基于流量,资源应用,谬误条件等多种因素提供加权负载平衡,以提供杰出的弹性。总的来说,Eureka 就是一个服务发现框架。何为服务,何又为发现呢? 举一个生存中的例子,就比方咱们平时租房子找中介的事件。 在没有中介的时候咱们须要一个一个去寻找是否有屋宇要出租的房东,这显然会十分的费劲,一你找凭一个人的能力是找不到很多房源供你抉择,再者你也懒得这么找上来(找了这么久,没有适合的只能将就)。这里的咱们就相当于微服务中的 Consumer ,而那些房东就相当于微服务中的 Provider 。消费者 Consumer 须要调用提供者 Provider 提供的一些服务,就像咱们当初须要租他们的房子一样。 然而如果只是租客和房东之间进行寻找的话,他们的效率是很低的,房东找不到租客赚不到钱,租客找不到房东住不了房。所以,起初房东必定就想到了播送本人的房源信息(比方在街边贴贴小广告),这样对于房东来说曾经实现他的工作(将房源颁布进来),然而有两个问题就呈现了。第一、其余不是租客的都能收到这种租房音讯,这在事实世界没什么,然而在计算机的世界中就会呈现资源耗费的问题了。第二、租客这样还是很难找到你,试想一下我须要租房,我还须要东一个西一个地去找街边小广告,麻不麻烦? 那怎么办呢?咱们当然不会那么傻乎乎的,第一工夫就是去找 中介 呀,它为咱们提供了对立房源的中央,咱们消费者只须要跑到它那里去找就行了。而对于房东来说,他们也只须要把房源在中介那里公布就行了。 ...

July 31, 2020 · 4 min · jiezi

关于springcloud:springcloud-sleuth学习一

1.什么是分布式链路追踪 随着分布式服务架构的风行,特地是微服务等设计理念在零碎中的利用,业务的调用链越来越简单。相干产品还有skywalking、zipkin 分布式服务跟踪是整个分布式系统中跟踪一个用户申请的过程(包含数据采集、数据传输、数据存储、数据分析、数据可视化),捕捉此类跟踪让咱们构建用户交互背地的整个调用链的视图,这是调试和监控微服务的要害工具。Spring Cloud Sleuth是Spring Cloud为分布式服务跟踪提供的解决方案,有了它,咱们能够: 提供链路追踪,故障疾速定位:能够通过调用链联合业务日志疾速定位错误信息。可视化各个阶段耗时,进行性能剖析各个调用环节的可用性、梳理服务依赖关系以及优化数据分析,优化链路:能够失去用户的行为门路,汇总剖析利用在很多业务场景。2.疾速应用springcloud-sleuth 2.1 springboot启动日志 springboot我的项目启动时日志如下: 当有申请进入时,控制台打印日志如下:(本我的项目没有配置spring.application.name) 2.2 日志含意 第一个值:trace1,它示意利用的名称,也就是配置文件spring.application.name的值。 第二个值:454445a6a7d9ea44,它是SpringCloudSleuth生成的一个ID,称为Trace ID,它用来标识一条申请链路,一条申请链路中蕴含一个Trace ID,多个Span ID。 第三个值:912a7c66c17214e0,它是SpringCloudSleuth生成的另外一个ID,称为Span ID,它示意一个根本的工作单元,比方发送一个http申请。 第四个值:false,示意是否要将该信息输入到Zipkin等服务中来收集和展现。 3. 集成与利用 3.1 与zipkin整合 提供web页面,能够方便快捷的展现申请的残缺生命周期和链式调用,便于疾速定位、剖析、解决问题 3.2 与ELK日志收集零碎整合 日志收集零碎,便于进行日志的收集、剖析与计算 官网链接:https://spring.io/projects/sp...

July 29, 2020 · 1 min · jiezi

关于spring-cloud:Spring-Cloud-Spring-Security实践二-自定义登录界面及鉴权

上一篇文章 [Spring Cloud] - Spring Security实际(一)- 基本概念及实际 中, 咱们曾经实现了根本的security鉴权和认证. 上面会在此基础上加一些自定义的配置. 摈弃自带的登陆界面, 实现自定义登陆界面 (themeleaf形式)对资源(controller)实现更细化的鉴权操作增加自定义登陆界面Spring security默认应用/login办法跳转到登录界面, 咱们替换login页面,只需将/login指向的界面换成本人的即可. 增加themeleaf依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>新建login controller@Controllerpublic class Login { @GetMapping("/login") private String loginController(){ return "login"; }}在我的项目构造的/resource/templates下新建login.html<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org" xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3"><head> <title>Spring Security Example </title></head><body><div th:if="${param.error}"> Invalid username and password.</div><div th:if="${param.logout}"> You have been logged out.</div><form th:action="@{/login}" method="post"> <div><label> User Name : <input type="text" name="username"/> </label></div> <div><label> Password: <input type="password" name="password"/> </label></div> <div><input type="submit" value="Sign In"/></div></form></body></html>Spring security框架会拦挡login的post申请 security的@configuration中,为以下配置@EnableWebSecuritypublic class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()) .withUser("root").password(new BCryptPasswordEncoder().encode("1234")).roles("ADMIN") .and() .withUser("user").password(new BCryptPasswordEncoder().encode("123")).roles("USER"); } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests()// .antMatchers("/", "/user").permitAll() .antMatchers("/user").hasRole("USER") .antMatchers("/admin").hasRole("ADMIN") .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .permitAll() .and() .logout() .permitAll(); }}

July 19, 2020 · 1 min · jiezi

SpringCloud-第十一篇-FeignRibbon

1:概述因为Spring Cloud Feign的客户端负载平衡是通过Spring Cloud Ribbon实现的,所以能够间接通过配置Ribbon客户端的形式来自定义各个服务客户端调用的参数2:全局配置ribbon.ConnectTimeout=500 ribbon.ReadTimeOut=50003:指定服务配置userService.ribbon.ConnectTimeout=500 userService.ribbon.ReadTimeout=20004:重试机制userService.ribbon.ConnectTimeout=500userService.ribbon.ReadTimeout=2000userService.ribbon.OkToRetryOnAllOperations=trueuserService.ribbon.MaxAutoRetriesNextServer=2userService.ribbon.MaxAutoRetries=1Ribbon的超时与Hystrix的超时是两个概念。个别须要让hystrix的超时工夫大于Ribbon的超时工夫,否则Hystrix命令超时后,间接熔断,重试机制就没有任何意义了5:参数绑定罕用绑定参数的形式 @RequestParam 绑定单个申请参数值@PathVariable 绑定URI模板变量值;@RequestHeader 绑定申请头数据;@RequestBody 绑定申请的内容区数据并能进行主动类型转换等留神在定义各参数绑定的时候,@RequestParam和@RequestHeader等能够指定参数名称的注解,它们的value值千万不能少。在spring mvc程序中,这些注解会依据指定参数名来作为默认值,然而在fegin中绑定参数必须通过value属性来指明具体的参数名,不然会抛出IllegalStateException异样,value属性不能为空。6:Feign的默认配置概述Spring Cloud的Feign的一个核心概念就是客户端。 每个Feign客户端都是组合的组件的一部分,它们一起工作以按需调用近程服务器,并且该汇合具备将其作为应用@FeignClient正文的参数名称。 SpringCloud应用FeignClientsConfiguration创立一个新的汇合,作为每个命名客户端的ApplicationContext(利用上下文),这蕴含feign.Decoder,feign.Encoder和feign.Contract。 Spring Cloud Netflix默认为Feign提供以下bean:Decoder feignDecoder:ResponseEntityDecoder(其中蕴含SpringDecoder)Encoder feignEncoder:SpringEncoderLogger feignLogger:Slf4jLoggerContract feignContract:SpringMvcContractFeign.Builder feignBuilder:HystrixFeign.BuilderClient feignClient:如果Ribbon启用,则为LoadBalancerFeignClient,否则将应用默认的feign客户端。能够自定义FeignClientsConfiguration以齐全管制这一系列的配置。 7:自定义配置写一个自定义配置类,留神不要放到以后ComponentScan的范畴下,示例如: @Configurationpublic class MyConf {    @Bean    public Contract feignContract() {        return new feign.Contract.Default();    }}定义的是new feign.Contract.Default(),所有在UserService接口中只能应用Feign本人的注解url形式,应用Spring MVC的注解就会报错写好配置后,通过设置@FeignClient的configuration来应用,如下:@FeignClient(value = "userService",configuration=MyConf.class)能够为每个Feign客户端都配置本人的默认配置8: @FeignClient@FeignClient标签的罕用属性如下: name(value):指定FeignClient的名称,如果我的项目应用了Ribbon,name属性会作为微服务的名称,用于服务发现url: url个别用于调试,能够手动指定@FeignClient调用的地址configuration: Feign配置类,能够自定义Feign的Encoder、Decoder、LogLevel、Contractfallback: 定义容错的解决类,当调用近程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口,并应用@Component注解fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性咱们能够实现每个接口通用的容错逻辑,缩小反复的代码path: 定义以后FeignClient的对立前缀,增加到Feign拜访服务的拜访门路上decode404:当产生http 404谬误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException serviceId属性当初已被弃用,有利于name属性。以前,应用url属性,不须要name属性。当初须要应用name 9:Feign和@Primary9.1:概述当应用Feign与Hystrix回退时,在同一类型的ApplicationContext中有多个bean。这将导致@Autowired不起作用,因为没有一个bean标记为主。为了解决这个问题,Spring Cloud Netflix将所有Feign实例标记为@Primary,所以Spring Framework将晓得要注入哪个bean。在某些状况下,这可能是不可取的。要敞开此行为,将@FeignClient的primary属性设置为false,如: @FeignClient(name = "hello", primary = false)10:Feign的HTTP ClientFeign在默认状况下应用的是JDK原生的URLConnection发送HTTP申请,没有连接池,然而对每个地址会放弃一个长连贯,即利用HTTP的persistence connection 。能够用Apache的HTTP Client替换Feign原始的http client, 从而获取连接池、超时工夫等与性能非亲非故的控制能力。Spring Cloud从Brixtion.SR5版本开始反对这种替换,首先在我的项目中申明Apache HTTP Client和feign-httpclient依赖: <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId></dependency><dependency> <groupId>com.netflix.feign</groupId> <artifactId>feign-httpclient</artifactId> <version>8.18.0</version></dependency>而后在application.properties中增加:  ...

July 17, 2020 · 1 min · jiezi

SpringCloud-Docker-K8s微服务集群部署

装置 K8s v18.4筹备两台机器,一台做master,一台做node1.配置yum源(两台机器都做) cd /etc/yum.repos.d/ rm -f \* curl -o CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo curl -o docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repocat <<EOF > /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=0repo_gpgcheck=0gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF2.装置docker并设置开启启动(两台机器都做)yum install -y docker-cesystemctl enable docker && systemctl start docker 3.装置kubeadm并设置开启启动,实际上是会主动装置kubelet、kubeadm、kubectl三个(两台机器都做)yum install -y kubeadmsystemctl enable kubelet && systemctl start kubelet 4.初始化kubeadm(只在master机器执行),留神apiserver-advertise-address的ip改成本人的master节点ip,最好ping一下看看有没有通,复制最初的kubeadm join 192.168.71.60:6443 --token...后续会用到kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.71.60 --image-repository mirrorgcrio --service-cidr=10.1.0.0/16 这里有个很诡异的BUG,笔者已经困住这一步好几天,就是这个问题https://github.com/kubernetes...新版本的移除了kubernetes-cni组件,然而新版本国内镜像较少,于是须要下老版本,然而老版本又说没有这个kubernetes-cni,导致很难堪。最初找到了个能用的镜像mirrorgcrio仓库终于下好了。 5.执行完下面命令后,依据输入提醒执行上面语句(只在master机器执行mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config 6.装置网络插件(master)下载文件https://github.com/WillLiaowh...执行文件kubectl apply -f kube-flannel.yml ...

July 10, 2020 · 1 min · jiezi

腾讯T9纯手写基于SpringCloudBootDocker开发源码笔记

这份笔记中的电商平台挪动商城开发+商家治理后盾与sso设计+平台治理后盾开发是基于Spring Cloud+Spring Boot+Docker开发的,同时每个我的项目的源代码也是在笔记当中(已上传GitHub)!这份笔记中的源码曾经全副上传,具体的获取链接在笔记当中。须要收费获取这份腾讯T8手写的源码笔记的敌人文末查看如何获取哦 9 电商平台挪动商城开发(源码已上传GitHub)挪动商城是电商平台一个十分重要的组成部分,它面向终端用户,为用户提供商品浏览、选购、订单查问和集体信息管理等服务,这些服务散布在不同的利用中,这些利用的设计也扩散在各个微服务工程的“wap" 模块中。本章介绍怎么将这些扩散的利用合并在一起应用,组成一个功能完善的挪动商城,体现出微服务架构设计中“合而用之”的概念。对于一个电商平台来说,挪动商城能够说是它的主体局部,它面向宽广的用户群体,所以必须具备极高的稳定性,并且可能适应大流量和高并发调用。上面将各个服务工程的挪动商城设计局部对立集中在-起进行介绍,以使读者对挪动商城的设计有一个全面的意识。 在笔记提供的电商平台实例中,挪动商城的次要性能包含商品展现、分类查问、购物车、订单查问、个人信息5项基本功能。各个性能的实现在以下几个模块中进行开发: 商品微服务工程“goods-microservice" 的“goods-wap" 模块。类目微服务工程“catalog microservice"的“catalog-wap" 模块。订单微服务工程“order-microservice" 的“order-wap" 模块。9.1挪动商城首页设计 9.2应用负载平衡的导航设计 9.3按分类查问设计 9.4商 品详情页设计 9.5购买下单实现 9.6用户登录与账户切换设计 9.6.1用户登录设计 9.6.2切换账号设计 9.7订单查问设计 9.8集成测试 10 商家治理后盾与SSO设计(源码已上传GitHub)在咱们所设计的电商平台实例中,商家是这个平台的配角,商家治理后盾就是专门为这个配角所提供的一个安全可靠的操作平台。在商家治理后盾中,商家能够进行商品治理、订单治理、物流治理、会员治理、评估治理等各个方面的管理工作。而这些治理及其服务性能的设计,别离由不同的微服务工程所实现,并通过不同利用进行部署。当初咱们要做的就是怎么将这些散布在不同利用之中的治理性能,组成一个具备 雷同的访问控制设计的治理后盾。通过应用单点登录设计就能够将这种扩散的利用通过统- -的权限治理,造成一个有机整体。 单点登录( Single Sign On,SSO )设计能够为分布式环境中的不同利用,提供一个对立的登录认证和受权治理。通过统-的受权认证, 商家管理员只有在任何一个利用之中登录一次,就能够失去应用其余利用的权限。所以,不论商家治理后盾的性能由多少个微服务利用组成,这对于一个商家管理员来说,它始终只是一个残缺的平台。商家治理后盾的设计和开发次要由商家治理开发和SsO开发两局部组成。其中,商家治理次要蕴含了商家及其权限体系的设计。 其中,商家及其权限体系的设计由“merchant object"、“merchant-domain”、“merchant-restapi"、“merchant-client"、“merchant-web” 等模块所组成。单点登录的开发由“merchant-sso”模块和“merchant-security" 模块组成。 10.1商家权限管理体系设计及开发 10.1.1商家权限体系建模10.1.2商家权限体系的长久化设计10.1.3商家权限体系的畛域服务开发10.2商家治理微服务开发 10.2.1商家领城服务层单元测10.2.2商家服务的接口开发10.3SSO设计 10.3.1SSO根本配置10.3.2 在SSO中应用商家的权限体系10.3.3用户登录设计10.3.4无关验证码的阐明10.3.5 SSO的主页设计10.3.6OAuth2服务端设计10.4SSO客户端设计 10.4.1客户端的项目管理配置10.4.2客户端的平安治理配置10.4.3权限验证实现原理10.4.4如何在利用中接入SSO10.4.5无关跨站申请伪造进攻的相干设置10.4.6依据用户权限 主动调配菜单 11 平台治理后盾开发(源码已上传GitHub)平台治理后盾是为电商平台的经营方提供服务的,它次要蕴含商家治理和一些公共配置管理的性能。在商家治理的设计中,包含商家的注册、审核和商家用户的权限治理,以及菜单配置管理等性能。除了一些公共治理性能的设计之外,平台自身的平安治理设计也是一项开发的内容。另外,无关商品类目标治理也应该纳入平台的治理领域之中,这样对整个平台类目设置能力有一个对立的标准。 平台治理后盾的开发次要蕴含两大部分的内容:-局部是治理后盾自身的权限治理设计;另一部分是商家及其权限的治理。 11.1平台治理后盾畛域设计 11.1.1畛域实体建模11.1.2实体的行为设计11.1.3畛域服务开发11.1.4畛域服务单元测试11.2平台治理后盾访问控制设计 11.2.1应用平台治理的用户体系11.2.2权限治理设计11.3 商家的注册设计 11.4商家菜单体系治理开发 11.4.1 分类菜单治理开发11.4.2 模块菜单治理开发11.4.3拜访资源管理开发11.5商家角色治理开发 当然上述的内容属于笔记当中的实际局部,上面我将会把笔记中的具体内容目录列举进去,这份笔记不仅教你怎么去搭建架构,教你如何如开发我的项目,还包含课前期的运维,属于很全面的内容!心愿大家通过这份笔记的学习,能够有一个不错的晋升! 第一章节 第二章节 第三章节 第四章节 第五章节+第六章节 ...

July 10, 2020 · 1 min · jiezi

SpringCloud-Alibaba微服务实战十七-JWT认证

概述在 OAuth2 体系中认证通过后返回的令牌信息分为两大类:不通明令牌(opaque tokens) 和 通明令牌(not opaque tokens)。 不通明令牌 就是一种无可读性的令牌,一般来说就是一段一般的 UUID 字符串。应用不通明令牌会升高零碎性能和可用性,并且减少提早,因为资源服务不晓得这个令牌是什么,代表谁,须要调用认证服务器获取用户信息接口,如下就是咱们在资源服务器中的配置,须要指明认证服务器的接口地址。 security: oauth2: resource: user-info-uri: http://localhost:5000/user/current/get id: account-service通明令牌的典型代表就是 JWT 了,用户信息保留在 JWT 字符串中,资源服务器本人能够解析令牌不再须要去认证服务器校验令牌。 之前的章节中咱们是应用了不通明令牌access_token,但思考到在微服务体系中这种中心化的受权服务会成为瓶颈,本章咱们就应用jwt来替换之前的access_token,专(zhuang)业(bi)点就叫去中心化。 jwt 是什么Json web token (JWT), 是为了在网络应用环境间传递申明而执行的一种基于JSON的凋谢规范(RFC 7519)。该token被设计为紧凑且平安的,特地实用于分布式站点的单点登录(SSO)场景。JWT的申明个别被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也能够减少一些额定的其它业务逻辑所必须的申明信息,该token也可间接被用于认证,也可被加密。简略点说就是一种固定格局的字符串,通常是加密的; 它由三局部组成,头部、载荷与签名,这三个局部都是json格局。 Header 头部:JSON形式形容JWT根本信息,如类型和签名算法。应用Base64编码为字符串Payload 载荷: JSON形式形容JWT信息,除了规范定义的,还能够增加自定义的信息。同样应用Base64编码为字符串。 iss: 签发者sub: 用户aud: 接管方exp(expires): unix工夫戳形容的过期工夫iat(issued at): unix工夫戳形容的签发工夫Signature 签名: 将前两个字符串用 . 连贯后,应用头部定义的加密算法,利用密钥进行签名,并将签名信息附在最初。JWT能够应用对称的加密密钥,但更平安的是应用非对称的密钥,本篇文章应用的是对称加密。 代码批改数据库原来应用access_token的时候咱们建设了7张oauth2相干的数据表 应用jwt的话只须要在数据库存储一下client信息即可,所以咱们只须要保留数据表oauth_client_details。 其余数据表已不再须要,大家能够删除。 认证服务 AuthorizationServerConfig批改 AuthorizationServerConfig 中TokenStore的相干配置@Beanpublic TokenStore tokenStore() { //return new JdbcTokenStore(dataSource); return new JwtTokenStore(jwtTokenEnhancer());}/** * JwtAccessTokenConverter * TokenEnhancer的子类,帮忙程序在JWT编码的令牌值和OAuth身份验证信息之间进行转换。 */@Beanpublic JwtAccessTokenConverter jwtTokenEnhancer(){ JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); // 设置对称签名 converter.setSigningKey("javadaily"); return converter;}之前咱们是将access_token存入数据库,应用jwt后不再须要存入数据库,所以咱们须要批改存储形式。 ...

July 10, 2020 · 2 min · jiezi

源码剖析ApiImplicitParam对RequestParam的required属性的侵入性

问题起源应用SpringCloud构建我的项目时,应用Swagger生成相应的接口文档是举荐的选项,Swagger可能提供页面拜访,间接在网页上调试后端系统的接口, 十分不便。最近却遇到了一个有点困惑的问题,演示接口示例如下(原有性能接口带有业务实现逻辑,这里简化了接口): /** * @description: 演示类 * @author: Huang Ying **/@Api(tags = "演示类")@RestController@Slf4jpublic class DemoController { @ApiOperation(value = "测试接口") @ApiImplicitParams({ @ApiImplicitParam(name = "uid", value = "用户ID", paramType = "query", dataType = "Long") }) @RequestMapping(value = "/api/json/demo", method = RequestMethod.GET) public String auth(@RequestParam(value = "uid") Long uid) { System.out.println(uid); return "the uid: " + uid; }}问题出在接口参数uid的必填性上,@RequestParam注解里require默认为true,要求必填,但@ApiImplicitParam注解里require默认为false,要求非必填,该业务接口在进行性能联调时,uid竟然能失去一个null值,依照个别认知习惯@ApiImplicitParam注解的次要作用是生成接口文档,不应该对@RequestParam的属性有侵入性才对,目前反馈的bug,让我狐疑@ApiImplicitParam是不是会侵入@RequestParam的require属性? 框架选型、版本及次要性能我的项目搭建SpringBoot版本:2.1.6.RELEASESpringCloud版本:Greenwich.SR3 业务模块SpringCloud业务模块应用的swagger: swagger bootstrap ui 1.9.6 加强swagger ui款式spring4all-swagger 1.9.0.RELEASE 配置化swagger参数,免去代码开发 业务网关SpringCloud业务网关应用的swagger: ...

July 9, 2020 · 4 min · jiezi

个人学习系列-SpringCloud项目搭建

一直想写springcloud的搭建教程,今天就来整理一下吧。搭建项目1. 创建一个空项目 2. 填写相关的信息 3. 新建项目后 4. 搭建服务中心4.1 添加模块 4.2 选择Spring Initializr方式创建 4.3 填写相关的组和工件 4.4 选择相关依赖 4.5 确认好相关内容点击完成 4.6 修改application.yml配置文件#eureka注册中心server: port: 8761 #端口号eureka: instance: hostname: localhost client: #表示十分将自己注册到Eureka Server,默认为true。由于当前应用就是Eureka Server,故而设为false。 register-with-eureka: false #表示是否从Eureka Server获取注册信息,默认为true。因为这是一个单点的Eureka Server,不需要同步其他 的Eureka Server节点的数据,故而设为false fetch-registry: false #置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址,默认是http://localhost:8761/eureka;多个地址可用,分隔 service-url: default-zone: http://${eureka.instance.hostname}:${server.port}/eureka/4.7 启动类添加注解@EnableEurekaServer是声明这是一个Eureka注册中心 @EnableEurekaServer@SpringBootApplicationpublic class ServerCenterApplication { public static void main(String[] args) { SpringApplication.run(ServerCenterApplication.class, args); }}4.8 访问127.0.0.1:8761如上图所示,看到没有任何的服务提供者。 5. 搭建服务提供者5.1 新建模块server-order构建方式和上面一样,就不再赘述了。 5.2 修改配置文件application.yml#eureka-client#端口号server: port: 8082eureka: instance: hostname: localhost #置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址,默认是http://localhost:8761/eureka;多个地址可用,分隔 client: service-url: default-zone: http://localhost:8761/eureka/spring: application: name: service-order5.3 启动类添加注解@EnableEurekaClient@SpringBootApplicationpublic class ServerOrderApplication { public static void main(String[] args) { SpringApplication.run(ServerOrderApplication.class, args); }}注册中心和服务提供者的主要区别就在于注解的不同。 ...

July 7, 2020 · 2 min · jiezi

Spring-Cloud-Alibaba系列五sentinel实现服务限流降级

一、sentinel是什么sentinel的官方名称叫分布式系统的流量防卫兵。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。在Spring Cloud项目中最开始我们使用的是Hystrix,目前已停止更新了。现在Spring Cloud官方推荐的是rensilience4j。当然还有我们今天学习的sentinel。 Sentinel 具有以下特征: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运 行情况。广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。二、sentinel实现限流2.1 安装sentinel控制台下载地址:https://github.com/alibaba/Se...这里我们直接下载jar包即可,下载后通过命令行启动: java -jar sentinel-dashboard-1.7.2.jar默认端口:8080默认用户名:sentinel默认密码:sentinel启动成功后,我们浏览器访问http://localhost:8080,出现如下界面。 2.2 微服务继承sentinel引入sentinel依赖<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>添加sentinel的相关配置server: port: 7003spring: application: name: sentinel-provider cloud: nacos: discovery: server-addr: 127.0.0.1:8848 sentinel: transport: dashboard: 127.0.0.1:8080提供个接口用来测试限流@SpringBootApplicationpublic class SentinelApplication { public static void main(String[] args) { SpringApplication.run(SentinelApplication.class, args); }}@RestControllerclass TestController{ @GetMapping("/test") public String test(){ return "hello! sentinel!"; }}我们请求几次这个接口后,打开sentinel控制台,就可以实时监控到这个sentinel-provider服务接口调用情况了。 ...

June 28, 2020 · 2 min · jiezi

springcloud-系列了解一下-OpenFeign

写在前面思考的过程往往比直接得到结论更加重要 Feign对于 feign,无疑就是整合了 ribbon + hystrix,然后封装为对开发使用起来更加友好的 jar。因此本质上,feign 是 ribbon + hystrix. 因此,在学习 Feign 之前,建议先把 ribbon, hystrix 学习一下。 尽管,Feign 只做了封装加强,但是有几个问题还是值得思考的 1、feign 如何完成对注解 @FeignClient 的加载的@EnableFeignClient 注解导入了 FeignClientsRegistrar 类, FeignClientsRegistrar 实现了 ImportBeanDefinitionRegistrar 接口,完成了对 @FeignClient 类的加载。 2、Fegin 一般是接口,它是如何完成动态代理的?2.1、未启用 Hystrix为每个 @FeignClient 注入的 Feign 配置类 FeignClientFactoryBean,实现了 FactoryBean。在 getObject()时,创建 ReflectiveFeign.FeignInvocationHandler。 FeignInvocationHandler 对应的就是被 @FeignClient 注解标注的类。方法则对应 SynchronousMethodHandler。 当在调用时 Feign 方法时,会被 FeignInvocationHandler 代理。 FeignInvocationHandler 创建流程如下 Feign 动态代理执行流程如下 2.2、启用 Hystrix当 feign.hystrix.enable=true 时,此时会被 @FeignClient 会被 HystrixInvocationHandler 代理,先走 Hystrix 的逻辑,然后再走 SynchronousMethodHandler 的逻辑。 ...

June 26, 2020 · 1 min · jiezi

Spring-Cloud-Alibaba系列四使用gateway作为服务网关

什么是网关在微服务架构里,服务的粒度被进一步细分,各个业务服务可以被独立的设计、开发、测试、部署和管理。这时,各个独立部署单元可以用不同的开发测试团队维护,可以使用不同的编程语言和技术平台进行设计,这就要求必须使用一种语言和平台无关的服务协议作为各个单元间的通讯方式。换句话说就是网关为所有的请求提供了统一的入口,方便我们对服务请求和响应做统一管理。 为什么要用网关API 网关是一个处于应用程序或服务(提供 REST API 接口服务)之前的系统,用来管理授权、访问控制和流量限制等,这样 REST API 接口服务就被 API 网关保护起来,对所有的调用者透明。 什么是gatewaySpring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。gateway工作原理 客户端向Spring Cloud网关发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。该处理程序运行通过特定于请求的过滤器链发送请求。过滤器由虚线分隔的原因是,过滤器可以在发送代理请求之前或之后执行逻辑。执行所有“前置”过滤器逻辑,然后发出代理请求。发出代理请求后,将执行“后”过滤器逻辑。路由规则路由和过滤器是gateway中非常重要的两个概念,gateway本身提供了非常丰富的路由规则和多种过滤器来适配我们的需求。gateway提供了11种路由规则,分别是: 后置路由谓词工厂该谓词匹配在当前日期时间之后发生的请求。参数名为 After 前置路由谓词工厂该谓词匹配当前日期时间之前发生的请求。参数名为 Before 时间段路由谓词工厂该谓词匹配在datetime1之后和datetime2之前发生的请求。参数名为 Between cookie路由谓词工厂该谓词匹配具有给定名称的cookie,并且值匹配正则表达式。参数名为 Cookie 标头路由谓词工厂该谓词与具有给定名称的标头匹配,并且值与正则表达式匹配。参数名为 Header 主机路由谓词工厂该谓词是指由路由进行匹配,匹配多个路由时用,隔开。参数名为 Host 方法路由谓词工厂该参数是一个或多个要匹配的HTTP方法。参数名为 Method 路径路由谓词工厂该谓词是指在请求路径上加一个前缀,以此来匹配。参数名为 Path 查询路由谓词工厂RemoteAddr路由谓词工厂重量路线谓词工厂其中,我们比较常用的就是路径路由谓词工厂,配合StripPrefix GatewayFilter工厂,实现我们的路由匹配转发。 路径路由谓词工厂配置如下: spring: cloud: gateway: discovery: locator: enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名称进行路由 routes: # 路由id,建议配合服务名 - id: demo_route #匹配路由名 uri: lb://demo-provider predicates: # 断言,路径相匹配的进行路由 - Path=/demo/** 配置的含义就是,如果请求路径中是/demo/**,则转发到demo-provider服务。 ...

June 17, 2020 · 2 min · jiezi

SpringCloud-Gateway-通过-Nacos-配置动态路由-代码片段

package com.jarvisbim.jarvis.cloud.gateway.core.components;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import com.alibaba.nacos.api.NacosFactory;import com.alibaba.nacos.api.config.ConfigService;import com.alibaba.nacos.api.config.listener.Listener;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Value;import org.springframework.cloud.gateway.event.RefreshRoutesEvent;import org.springframework.cloud.gateway.route.RouteDefinition;import org.springframework.cloud.gateway.route.RouteDefinitionWriter;import org.springframework.context.ApplicationEventPublisher;import org.springframework.context.ApplicationEventPublisherAware;import org.springframework.stereotype.Component;import reactor.core.publisher.Mono;import javax.annotation.PostConstruct;import javax.annotation.Resource;import javax.validation.constraints.NotNull;import java.util.ArrayList;import java.util.List;import java.util.Properties;import java.util.concurrent.Executor;/** * 动态路由组件 * <pre> * 监听Nacos配置文件的变化, 把配置文件的变更后的数据动态写入, 达到不重启Gateway, 也可以配置路由的要求 * - java 使用nacos config: @link: https://nacos.io/zh-cn/docs/sdk.html * </pre> * @author mao * @date 10/06/2020 14:52 */@Slf4j@Componentpublic class DynamicRouteComponent implements ApplicationEventPublisherAware { @Value("${spring.cloud.nacos.config.server-addr}") private String serverAddr; @Value("${jarvis.nacos.global.group}") private String group; @Value("${jarvis.gateway-router-data-id}") private String routeConfigDataId; @Value("${jarvis.nacos.global.namespace}") private String namespace; @Resource private RouteDefinitionWriter routeDefinitionWriter; private ApplicationEventPublisher applicationEventPublisher; private static final List<String> ROUTE_LIST = new ArrayList<>(); @Override public void setApplicationEventPublisher(@NotNull ApplicationEventPublisher applicationEventPublisher) { this.applicationEventPublisher = applicationEventPublisher; } @PostConstruct public void dynamicRouteListener() { try { Properties properties = new Properties(); properties.put("serverAddr", serverAddr); properties.put("namespace", namespace); ConfigService configService = NacosFactory.createConfigService(properties); // 程序首次启动, 并加载初始化路由配置 String initConfigInfo = configService.getConfig(routeConfigDataId, group, 5000); addAndPublishBatchRoute(initConfigInfo); configService.addListener(routeConfigDataId, group, new Listener() { @Override public void receiveConfigInfo(String configInfo) { addAndPublishBatchRoute(configInfo); } @Override public Executor getExecutor() { return null; } }); } catch (Exception e) { e.printStackTrace(); } } /** * 清空所有路由 */ private void clearRoute() { for(String id : ROUTE_LIST) { this.routeDefinitionWriter.delete(Mono.just(id)).subscribe(); } ROUTE_LIST.clear(); } /** * 添加单条路由信息 * @param definition RouteDefinition */ private void addRoute(RouteDefinition definition) { routeDefinitionWriter.save(Mono.just(definition)).subscribe(); ROUTE_LIST.add(definition.getId()); } /** * 批量 添加及发布 路由 * @param configInfo 配置文件字符串, 必须为json array格式 */ private void addAndPublishBatchRoute(String configInfo) { try { clearRoute(); List<RouteDefinition> gatewayRouteDefinitions = JSONObject.parseArray(configInfo, RouteDefinition.class); for (RouteDefinition routeDefinition : gatewayRouteDefinitions) { addRoute(routeDefinition); } publish(); log.info("Dynamic config gateway route finished. {}", JSON.toJSONString(gatewayRouteDefinitions)); } catch (Exception e) { e.printStackTrace(); } } private void publish() { this.applicationEventPublisher.publishEvent(new RefreshRoutesEvent(this.routeDefinitionWriter)); }}

June 10, 2020 · 2 min · jiezi

springcloud-系列-简单了解一下-hystrix

写在前面思考的过程往往比直接得到结论更加重要 1、为什么需要熔断器服务雪崩在分布式环境下,不可避免的就是服务之间的调用。A 调 B,B 可能会失败,如果此时 B 服务挂掉,那么会导致服务 A 因为服务 B 的失败而失败。从而导致 客户端认为 A 也是失败的。 简单说就是,牵一发而动全身 这也是,我们需要熔断器的原因。我们需要有保护服务调用的组件。当服务 B 挂掉时,服务 B 需要能够快速失败。 2、如果自己写一个断路器,你会怎么做呢?隔离策略思考一下,什么是隔离?我对他的理解,大概就是,服务 A 调用服务 B,服务 C。不能因为调用服务 B 出现问题,而导致调用服务 C 也出现问题。也就是,服务B、服务C 的调用应该放在不同的环境下。 常见的资源隔离,有线程池隔离,信号量隔离 线程池隔离信号量隔离线程请求线程和调用 provider 不是同一个线程请求线程和调用 provider 是同一个线程开销排队、调度、上下文开销等无线程切换,开销低异步支持不支持并发支持支持(线程池大小)支持(信号量上限)传递 Header无法传递 Http Header可以传递 Http Header快速失败当 provider 提供的服务不可用,或出现异常时,应该有可供回调的降级方法。 provider 调用失败抛出异常,可能针对某种异常,不想执行快速失败策略,而是需要直接抛出异常provider 调用失败,可能不想执行快速失败策略,也不想抛出任何异常。限流当 provider 被大量调用时,为了保护链路,需要做限流。那么其实核心的问题是,如何进行统计。 统计每个 provider 的调用情况需要统计。这样可以更好的监控到 provider 提供的服务的情况。统计的算法,应该是基于滑动窗口进行统计。 熔断因为有对每个 provider 调用情况统计,在调用之前,失败次数达到某个阈值时,可以认为该 provider 已经是有问题的,可以直接快速失败,以防止服务雪崩情况。 系统自适应保护熔断机制是针对每个 provider 的。但是,有可能服务系统已经要达到极限了,不能再接收任何请求了,那么此时,出于系统的保护,也应该快速失败。 扩展作为一个组件,支持扩展那是必须。常见的扩展方式:(其实就是面向接口编程,在某些执行流程中,暴露出部分接口。剩下的就看你怎么封装了) 观察者设计模式 + 策略设计模式。 例如public interface SayListener { String say();}public class App { List<SayListener> sayListener = new ArrayList<>(); public void doSomething() { // ... sayAction(); // 触发了 say 的动作 if (null != sayListener && sayListener.size() > 0) { sayListener.forEach(listener -> { listener.say(); }); } // ... } public void sayAction() {} public void registerSayListener(SayListener listener) { sayListener.add(listener); }}3、现有类似功能组件对比 sentinelhystrixresilience4j隔离策略信号量隔离(并发线程数限流)线程池隔离/信号量隔离信号量隔离熔断降级策略基于响应时间、异常比率、异常数基于异常比率基于异常比率、响应时间实时统计实现滑动窗口(LeapArray)滑动窗口(RxJava)Ring Bit Buffer动态规则配置支持多种数据源支持多种数据源有限支持扩展性多个扩展点插件形式接口形式基于注解的支持支持支持支持限流基于 QPS, 支持基于调用关系的限流基于线程池个数有限支持Rate Limiter系统自适应保护支持不支持不支持控制台丰富简单不提供控制台,可对接其他监控系统hystrix wiki 介绍实在太全了,这里就没必要在介绍了,主要是从个人的角度去思考如果让自己也实现一个断路器中间件,你会怎么做?(鉴于 hystrix 停止维护,就没看源码了,以及 sentinel 的活跃,重心会放在 sentinel 上) ...

June 7, 2020 · 1 min · jiezi

springcloud项目优雅重启二eurekaclient

启动eureka-client启动后,会向eureka-server注册,同时会定时续约 (renew);为了提升性能,eureka-client启用了本地缓存,缓存存在localRegionApps里,定时更新缓存。eureka-client的核心类是DiscoveryClient。 @InjectDiscoveryClient(ApplicationInfoManager applicationInfoManager, EurekaClientConfig config, AbstractDiscoveryClientOptionalArgs args, Provider<BackupRegistry> backupRegistryProvider) { if (args != null) { this.healthCheckHandlerProvider = args.healthCheckHandlerProvider; this.healthCheckCallbackProvider = args.healthCheckCallbackProvider; this.eventListeners.addAll(args.getEventListeners()); this.preRegistrationHandler = args.preRegistrationHandler; } else { this.healthCheckCallbackProvider = null; this.healthCheckHandlerProvider = null; this.preRegistrationHandler = null; } this.applicationInfoManager = applicationInfoManager; InstanceInfo myInfo = applicationInfoManager.getInfo(); clientConfig = config; staticClientConfig = clientConfig; transportConfig = config.getTransportConfig(); instanceInfo = myInfo; if (myInfo != null) { appPathIdentifier = instanceInfo.getAppName() + "/" + instanceInfo.getId(); } else { logger.warn("Setting instanceInfo to a passed in null value"); } this.backupRegistryProvider = backupRegistryProvider; this.urlRandomizer = new EndpointUtils.InstanceInfoBasedUrlRandomizer(instanceInfo); localRegionApps.set(new Applications()); fetchRegistryGeneration = new AtomicLong(0); remoteRegionsToFetch = new AtomicReference<String>(clientConfig.fetchRegistryForRemoteRegions()); remoteRegionsRef = new AtomicReference<>(remoteRegionsToFetch.get() == null ? null : remoteRegionsToFetch.get().split(",")); if (config.shouldFetchRegistry()) { this.registryStalenessMonitor = new ThresholdLevelsMetric(this, METRIC_REGISTRY_PREFIX + "lastUpdateSec_", new long[]{15L, 30L, 60L, 120L, 240L, 480L}); } else { this.registryStalenessMonitor = ThresholdLevelsMetric.NO_OP_METRIC; } if (config.shouldRegisterWithEureka()) { this.heartbeatStalenessMonitor = new ThresholdLevelsMetric(this, METRIC_REGISTRATION_PREFIX + "lastHeartbeatSec_", new long[]{15L, 30L, 60L, 120L, 240L, 480L}); } else { this.heartbeatStalenessMonitor = ThresholdLevelsMetric.NO_OP_METRIC; } logger.info("Initializing Eureka in region {}", clientConfig.getRegion()); if (!config.shouldRegisterWithEureka() && !config.shouldFetchRegistry()) { logger.info("Client configured to neither register nor query for data."); scheduler = null; heartbeatExecutor = null; cacheRefreshExecutor = null; eurekaTransport = null; instanceRegionChecker = new InstanceRegionChecker(new PropertyBasedAzToRegionMapper(config), clientConfig.getRegion()); // This is a bit of hack to allow for existing code using DiscoveryManager.getInstance() // to work with DI'd DiscoveryClient DiscoveryManager.getInstance().setDiscoveryClient(this); DiscoveryManager.getInstance().setEurekaClientConfig(config); initTimestampMs = System.currentTimeMillis(); logger.info("Discovery Client initialized at timestamp {} with initial instances count: {}", initTimestampMs, this.getApplications().size()); return; // no need to setup up an network tasks and we are done } try { // default size of 2 - 1 each for heartbeat and cacheRefresh scheduler = Executors.newScheduledThreadPool(2, new ThreadFactoryBuilder() .setNameFormat("DiscoveryClient-%d") .setDaemon(true) .build()); heartbeatExecutor = new ThreadPoolExecutor( 1, clientConfig.getHeartbeatExecutorThreadPoolSize(), 0, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), new ThreadFactoryBuilder() .setNameFormat("DiscoveryClient-HeartbeatExecutor-%d") .setDaemon(true) .build() ); // use direct handoff cacheRefreshExecutor = new ThreadPoolExecutor( 1, clientConfig.getCacheRefreshExecutorThreadPoolSize(), 0, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), new ThreadFactoryBuilder() .setNameFormat("DiscoveryClient-CacheRefreshExecutor-%d") .setDaemon(true) .build() ); // use direct handoff eurekaTransport = new EurekaTransport(); scheduleServerEndpointTask(eurekaTransport, args); AzToRegionMapper azToRegionMapper; if (clientConfig.shouldUseDnsForFetchingServiceUrls()) { azToRegionMapper = new DNSBasedAzToRegionMapper(clientConfig); } else { azToRegionMapper = new PropertyBasedAzToRegionMapper(clientConfig); } if (null != remoteRegionsToFetch.get()) { azToRegionMapper.setRegionsToFetch(remoteRegionsToFetch.get().split(",")); } instanceRegionChecker = new InstanceRegionChecker(azToRegionMapper, clientConfig.getRegion()); } catch (Throwable e) { throw new RuntimeException("Failed to initialize DiscoveryClient!", e); } if (clientConfig.shouldFetchRegistry() && !fetchRegistry(false)) { fetchRegistryFromBackup(); } // call and execute the pre registration handler before all background tasks (inc registration) is started if (this.preRegistrationHandler != null) { this.preRegistrationHandler.beforeRegistration(); } // 这里clientConfig.shouldEnforceRegistrationAtInit()默认为false if (clientConfig.shouldRegisterWithEureka() && clientConfig.shouldEnforceRegistrationAtInit()) { try { if (!register() ) { throw new IllegalStateException("Registration error at startup. Invalid server response."); } } catch (Throwable th) { logger.error("Registration error at startup: {}", th.getMessage()); throw new IllegalStateException(th); } } // finally, init the schedule tasks (e.g. cluster resolvers, heartbeat, instanceInfo replicator, fetch initScheduledTasks(); try { Monitors.registerObject(this); } catch (Throwable e) { logger.warn("Cannot register timers", e); } // This is a bit of hack to allow for existing code using DiscoveryManager.getInstance() // to work with DI'd DiscoveryClient DiscoveryManager.getInstance().setDiscoveryClient(this); DiscoveryManager.getInstance().setEurekaClientConfig(config); initTimestampMs = System.currentTimeMillis(); logger.info("Discovery Client initialized at timestamp {} with initial instances count: {}", initTimestampMs, this.getApplications().size());}DiscoveryClient初始化时,在本地缓存放入了空列表,创建了定时任务启动器和线程池,启动定时任务;由于clientConfig.shouldEnforceRegistrationAtInit()默认为false,所以在初始化时并不会执行注册方法register()。 ...

June 5, 2020 · 12 min · jiezi

springcloud项目优雅重启一问题和gatewayribbon流程

问题当前项目用的是springcloud-gateway + eureka + springboot架构,请求会先经过网关,网关根据注册中心获取业务项目服务器地址,再转发到业务服务接口上;这种架构在项目重启时,存在几个问题 : 业务项目实例shutdown时,会停止当前未完成的REQUEST请求。某个业务项目实例已经停止了,但是网关仍会转发请求过去,导致请求失败。某个业务项目实例已经重新启动了,但是网关并不会马上向这个实例转发请求;假如项目只有两个实例,如果在第一个节点刚启动完就立刻重启另外一个实例,就会导致服务不可用。要解决以上问题,我们需要先了解gateway、eureka、ribbon、Tomcat的原理,明白为什么会出现以上问题。 主流程先从gateway入口处开始了解,以下是springcloud-gateway官网的一张图:有个关键类RoutePredicateHandlerMapping,继承了AbstractHandlerMapping,是webflux的handlermapping,作用相当于webmvc的handlermapping:将请求映射到对应的handler来处理。RoutePredicateHandlerMapping会遍历所有路由Route,获取符合规则的路由,并将获取到的route放入当前请求上下文的属性中。 public class RoutePredicateHandlerMapping extends AbstractHandlerMapping { @Override protected Mono<?> getHandlerInternal(ServerWebExchange exchange) { // don't handle requests on the management port if set if (managmentPort != null && exchange.getRequest().getURI().getPort() == managmentPort.intValue()) { return Mono.empty(); } exchange.getAttributes().put(GATEWAY_HANDLER_MAPPER_ATTR, getSimpleName()); return lookupRoute(exchange) // .log("route-predicate-handler-mapping", Level.FINER) //name this .flatMap((Function<Route, Mono<?>>) r -> { exchange.getAttributes().remove(GATEWAY_PREDICATE_ROUTE_ATTR); if (logger.isDebugEnabled()) { logger.debug("Mapping [" + getExchangeDesc(exchange) + "] to " + r); } exchange.getAttributes().put(GATEWAY_ROUTE_ATTR, r); return Mono.just(webHandler); }).switchIfEmpty(Mono.empty().then(Mono.fromRunnable(() -> { exchange.getAttributes().remove(GATEWAY_PREDICATE_ROUTE_ATTR); if (logger.isTraceEnabled()) { logger.trace("No RouteDefinition found for [" + getExchangeDesc(exchange) + "]"); } }))); } protected Mono<Route> lookupRoute(ServerWebExchange exchange) { return this.routeLocator .getRoutes() //individually filter routes so that filterWhen error delaying is not a problem .concatMap(route -> Mono .just(route) .filterWhen(r -> { // add the current route we are testing exchange.getAttributes().put(GATEWAY_PREDICATE_ROUTE_ATTR, r.getId()); return r.getPredicate().apply(exchange); }) //instead of immediately stopping main flux due to error, log and swallow it .doOnError(e -> logger.error("Error applying predicate for route: "+route.getId(), e)) .onErrorResume(e -> Mono.empty()) ) // .defaultIfEmpty() put a static Route not found // or .switchIfEmpty() // .switchIfEmpty(Mono.<Route>empty().log("noroute")) .next() //TODO: error handling .map(route -> { if (logger.isDebugEnabled()) { logger.debug("Route matched: " + route.getId()); } validateRoute(route, exchange); return route; }); /* TODO: trace logging if (logger.isTraceEnabled()) { logger.trace("RouteDefinition did not match: " + routeDefinition.getId()); }*/ }}从routeLocator.getRoutes()看到是从routeLocator里获取路由列表,我们看下路由规则是怎么生成的。routeLocator有个实现类是RouteDefinitionRouteLocator。 ...

June 4, 2020 · 11 min · jiezi

springcloud-系列-三言两语带你认识-ribbon

前言ribbon 作为一个负载均衡组件,个人认为,其核心的功能就是提供多种负载均衡策略。 暂停思考一下,如果让你自己写负载均衡组件,要如何做? 获取有多少合适的服务可供负载服务有时候可能会不可用,那么需要更新维护服务,及时将不合理的服务剔除提供策略判断服务是否可用实现多种负载算法,供用户选择负载失败后的重试实际上, ribbon 的核心功能,也大概就是上面我说的这些。 理论1、获取有多少合适的服务可供负载当今的应用,大多数部署在云上,并向全国各地提供服务。假设服务 A 在福建、北京均有部署。当在北京的服务器请求了服务 A,最合理的情况,应该要由北京的服务器响应。 其实,这里引入了 ribbon 的一个核心概念。区域亲和性说人话就是,优先选择同一个区域的服务(除非同一区域的服务都挂了) (注:eureka 可以配置 region 和 zone ) 关于 eureka 分区配置,请参考文章 eureka分区的深入讲解 2、服务维护解决了第一个问题。接下来,要考虑如何维护服务列表?最简单的方式,其实就是直接写个定时器,每隔 30s。重新拉取服务列表,维护最新的可用服务列表。 ribbon 的实现就是这样。 ribbon 中,由 PollingServerListUpdater 每隔 30s 更新服务列表。 3、服务是否可用判断有了服务列表,还需要,判断服务可不可用,及时剔除不可用的服务。那么最简单的方式,就是直接 ping 该服务,看是否正常返回。但是,要考虑一个问题,如果你的服务非常多,每次检查的时候,都需要 ping 服务,那么这样会不会太损耗性能了? ribbon 中,有 ping 的抽象:IPing ,而且还有 ping 策略的抽象:IPingStrategy。 在 SerialPingStrategy(默认的 IPingStrategy 实现)实现中, ribbon 就考虑到了,我们上述说的问题。因此,实际上, ribbon 在判断服务是否可用,并非真正的 ping 服务,而是仅用服务的 up 的状态判断服务是否可用。 4、负载均衡算法服务列表维护好了,接下来就是实现负载均衡算法了。我们自己实现负载均衡算法时,算法肯定是会有非常多的。那么肯定要先抽象出一个 IRule 接口, 定义如何选择一个服务。 ribbon中,将负载均衡算法抽象为 IRule。 有以下算法 RoundRobinRule轮询策略。Ribbon 默认采用的策略。若经过一轮轮询没有找到可用的 provider,其最多 轮询 10 轮。若最终还没有找到,则返回 null。RandomRule随机策略,从所有可用的 provider 中随机选择一个。RetryRule重试策略。先按照 RoundRobinRule 策略获取 provider,若获取失败,则在指定的时限内 重试。默认的时限为 500 毫秒BestAvailableRule最可用策略。选择并发量最小的 provider,即连接的消费者数量最少的 provider。AvailabilityFilteringRule可用过滤算法。该算法规则是:过滤掉处于服务熔断状态的 provider,或已经超过连接 极限的 provider,对剩余 provider 采用轮询策略。ZoneAvoidanceRule区域回避策略。综合 provider 所在区域的性能及 provider 的可用性,对服务器进行选择。WeightedResponseTimeRule“权重响应时间”策略。根据每个 provider 的平均响应时间计算其权重,响应时间越快 权重越大,被选中的机率就越高(并非是权重最大的一定被选定)。在刚启动时采用轮询策 略。后面就会根据权重进行选择了。ribbon 默认使用的算法为 RoundRobinRule (实际上是多种 IRule 一起协调工作,过程较复杂) ...

May 31, 2020 · 2 min · jiezi

搭建SpringCloud微服务框架六数据库持久层SpringDataJPA

搭建微服务框架(数据库持久层-SpringDataJPA) 用惯了Mybatis,这次来换换口味,在SQuid中集成SpringDataJPA。本文源地址:搭建微服务框架(数据库持久层-SpringDataJPA) Github地址:SQuid 介绍以前都是听说过的是 HibernateJPA ,却从来没有使用过,一直在项目中使用的是 Mybatis。 SpringDataJPA是基于Hibernate的底层封装的一套ORM框架,使用起来的第一感觉是代码量真的很少,相较传统的Mybatis来说,感觉最起码少了60%,当然大部分都是体现在xml文件上。 介绍真的没有太多词汇可以展示出来,下面来进行使用。? 使用在squid项目中,我们新建一个 squid-example-jpa的项目(由于之前的example目录被删除,可以根据下面的层级目录来进行新建) 引入依赖:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId></dependency><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId></dependency><dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId></dependency>生成Java实体如果使用的是IDEA,完全可以参考这篇博客 IDEA下生成SpringDataJPA的Java实体 来生成实体信息。 因为使用了lombok,所以在生成的实体中并没有 getter setter 方法呈现,关于lombok可以了解一下 Lombok DAO生成了实体信息后,DAO文件就需要我们自己来手工生成了: public interface EdocInvoiceRepository extends JpaRepository<EdocInvoice, Long> {}一般我们直接继承的是 JpaRepository ,这个是包含所有JPA处理的类,基本上拥有了所有持久层的交互方法。 JPARespository: public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> { List<T> findAll(); List<T> findAll(Sort var1); List<T> findAllById(Iterable<ID> var1); <S extends T> List<S> saveAll(Iterable<S> var1); void flush(); <S extends T> S saveAndFlush(S var1); void deleteInBatch(Iterable<T> var1); void deleteAllInBatch(); T getOne(ID var1); <S extends T> List<S> findAll(Example<S> var1); <S extends T> List<S> findAll(Example<S> var1, Sort var2);}如果你还有其他需求,比如需要根据某两个字段进行查询等等,SpringDataJPA完全支持: ...

May 29, 2020 · 2 min · jiezi

搭建SpringCloud微服务框架一结构和各个组件

搭建微服务框架(结构和各个组件)简介 SQuid是基于Spring,SpringBoot,使用了SpringCloud下的组件进行构建,目的是想搭建一套可以快速开发部署,并且很好上手的一套微服务框架。本文源地址:搭建微服务框架(结构和各个组件) Github地址:SQuid 组件[Spring-Cloud-Feign]()[Spring-Security-OAuth]()Spring-Cloud-GatewaySpring-Cloud-Alibaba中间件[Redis]()NacosSentinel数据库持久层[SpringDataJPA]()Mybatis-Plus数据库Mysql5.7 +Oracle环境JDK1.8Maven3.2.5Idea如果你的电脑上已经有安装好上面的程序,那么你可以打开git,输入命令 git@github.com:yanzhenyidai/squid.git 将本项目克隆到本地运行。 不过也可以先看看后面各个组件的集成的说明,送上链接: SC服务注册与发现读取Nacos的配置信息服务接口鉴权服务网关处理数据库持久层-SpringDataJpa[TODO:数据库持久层-Mybatis-Plus]()[TODO:服务熔断和跟踪-Sentinel]()项目依赖本次项目是在 spring-boot: 2.0.9.RELEASE 下搭建,所需依赖文件如下: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.9.RELEASE</version> </parent> <properties> <spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version> <spring-cloud-openfeign.version>2.2.0.RELEASE</spring-cloud-openfeign.version> <spring-cloud.version>Finchley.SR2</spring-cloud.version> <druid-starter.version>1.1.21</druid-starter.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>${druid-starter.version}</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring-cloud-alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-openfeign-dependencies</artifactId> <version>${spring-cloud-openfeign.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>parent以 springboot 开始,原因为 springcloud是基于 springboot 的一套脚手架工具,在搭建本项目时遇到了不少的版本冲突的问题,可以看一下springboot和springcloud版本整理。 希望能对你有到帮助。

May 29, 2020 · 1 min · jiezi

搭建SpringCloud微服务框架二SpringCloud服务注册与发现

搭建微服务框架(SC服务注册与发现)本文源地址:https://yanzhenyidai.com/#/squid/squid-2.1-sc-serverGithub地址:SQuid 服务注册中心-NacosNacos是阿里开源的一款注册中心中间件,详细介绍可以访问Nacos官网,本次框架是基于Nacos做的注册。 安装Nacos我们可以使用Docker,Docker可以很快的安装好Nacos并且启动。 而在本项目中,引入的Nacos两个依赖分别如下: <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>完成对Nacos的依赖引入后,可以进行下一步的SpringCloud服务发布的操作,?。 SpringCloud服务发布我们新建俩个Maven模块项目,用它来实现服务提供者的角色。 如上,分别以 squid-example-api 和 squid-example-provider 命名。 squid-example-apisquid-example-api 项目中主要是写一些接口文件,将这些接口对外注册并且暴露出去,引入依赖: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>新建一个 HiService 的接口,并且注明 @FeignClient("squid-example-sc-provider"),注解内名称可以为项目名: @FeignClient("squid-example-sc-provider") public interface HiService { @RequestMapping(value = "/hi", method = RequestMethod.GET) public String hi(@RequestParam("msg") String msg); } PS:这里是为了明确各个模块,所以将 squid-example-api 和 squid-example-provider 进行分离,也可以将两个模块合并。 squid-example-provider然后我们依旧是在 squid-example-provider 引入依赖: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.yanzhenyidai</groupId> <artifactId>squid-example-sc-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency>引入 spring-cloud-start-openfeign 是将服务以 Http Restful 的形式进行对外发布(SC的服务基本上都是以Http Restful的形式, 可以了解一下 Dubbo或者其他RPC的服务注册,也可以看一下 [RPC和HTTP]()),而 spring-boot-starter-web 则是表明该项目需要以Web的形式进行启动, 不难理解,毕竟HTTP请求是有需要一个Web容器来进行。 ...

May 29, 2020 · 2 min · jiezi

搭建SpringCloud微服务框架五SpringCloudGateway-服务网关处理

搭建微服务框架(服务网关处理)本篇来进行介绍微服务网关集成的使用操作,基于SpringCloudGateway。本文源地址:搭建微服务框架(服务网关处理) Github地址:SQuid Spring-Cloud-Gateway由于SpringCloud-Netflix的Zuul组件不再维护,而Spring官方推出了Gateway的新组件,并且支持了SringCloud2.0的版本,所以在选型方面,直接就选择了Spring官方的Gateway。 介绍Gateway,不得不将它与Zuul进行比较。 的确,Zuul的网关处理流程很一目了然,基于一个 ZuulFilter,而后可以定义 preRoute() route() postRoute() error(),类似于Spring的前置通知,后置通知,环绕通知,算得上是不错的网关处理组件, 比较可惜的是,SpringCloud-Netfilx的停止更新,使得SpringCloud的网关处理选择为了 Spring-Cloud-Gateway。 众所周知,Zuul是基于Serverlet,而Gateway是基于Netty,两个谁更优秀,这个目前也是进行不了一个定义,广义上来说也是传统的 Http和TCP 的比较。 下面介绍Gateway的使用,? 使用Spring-Cloud-Gateway首先贴一下工程截图: 很简单的一个例子,先新建一个 squid-gateway 的工程,引入如下依赖: pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-gateway-core</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> <dependency> <groupId>org.isomorphism</groupId> <artifactId>token-bucket</artifactId> <version>1.7</version> </dependency>GatewayApplication@SpringBootApplication@EnableDiscoveryClientpublic class GateWayApplication { public static void main(String[] args) { SpringApplication.run(GateWayApplication.class, args); }}application.yaml最主要的就是application.yaml文件了,里面可以配置路由转发规则,当然也可以直接在 GatewayApplication.java 文件中写java代码来进行转发,不过我总认为这样不太直观,下面来看一下文件: ...

May 29, 2020 · 1 min · jiezi

SpringCloud-注册中心之Consul

【转载请注明出处】:https://segmentfault.com/a/1190000022778386 Consul 介绍Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其它分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其它工具(比如 ZooKeeper 等)。使用起来也较 为简单。Consul 使用 Go 语言编写,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。 Consul 的优势:使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接. 相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft。支持多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟, 分片等情况等。 zookeeper 和 etcd 均不提供多数据中心功能的支持。支持健康检查。 etcd 不提供此功能。支持 http 和 dns 协议接口。 zookeeper 的集成较为复杂, etcd 只支持 http 协议。官方提供 web 管理界面, etcd 无此功能。综合比较, Consul 作为服务注册和配置管理的新星, 比较值得关注和研究。 特性:服务发现健康检查Key/Value 存储多数据中心Consul 角色client: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群。server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其它数据中心通讯。 每个数据中心的 server 数量推荐为 3 个或是 5 个。Consul 客户端、服务端还支持夸中心的使用,更加提高了它的高可用性。 ...

May 29, 2020 · 3 min · jiezi

SpringCloudNetfilx入门

整体框架由于整个微服务使用springcloud进行管理,所以采用maven聚合工程 导包最好使用父项目进行版本控制 <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR4</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.2.5.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies></dependencyManagement>注意点:maven中和Java类似没有多继承这个概念,间接实现多继承就可以使用import对包进行导入,这样子包就能继承版本控制 注册中心<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency></dependencies>客户端(服务提供者也是客户端)<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--实现负载均衡--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> <!--显示info信息--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency></dependencies>application配置注册中心server: port: 8000eureka: client: register-with-eureka: false # 不讲自己注册进注册中心 fetch-registry: false # 不拉取服务在springboot应用中开启EurekaServer @SpringBootApplication@EnableEurekaServerpublic class RegistryApplication { public static void main(String[] args) { SpringApplication.run(RegistryApplication.class); }}服务提供者或消费者server: port: 8081eureka: client: service-url: defaultZone: http://localhost:8000/eureka # 服务中心的地址,','隔开可以写多个实现集群 instance: instance-id: consumer-port:8081 # status的名称spring: application: name: consumer # 服务的名称debug: true# 配置自己的信息info: app.name: roderick在springboot应用中开启EurekaServer ...

May 27, 2020 · 1 min · jiezi

Spring-Cloud-Zuul-实践二-负载均衡

Zuul内部通过Ribbon实现的负载均衡。初次接触,不需要了解太多,还是老办法,上demo。 本文涉及的demo是在zuul的第一课: [Spring Cloud] - Zuul 实践(一) - 基本使用 的基础上建立的,建议从第一课读起(直接看此文亦可,本文通俗易懂,老少皆宜)。 Zuul的负载均衡是建立在同一服务的多个实例的前提下实现的,通俗点说,在eureka server中连接多个相同服务,是Zuul负载均衡的前提。 我们建立两个不同的工程,其中设置相同的application.name。 创建步骤该不赘述,请参考我的另一篇文档[Spring Cloud] - Eureka 创建及使用 的创建eureka client的步骤。注意: 确定两个工程中配置文件的spring.application.name相同。 spring: application: name: service1将两个工程启动,查看eureka server中是否注册了两个相同的服务:(Availability Zones的数字为service的副本数量) 此时若使用zuul访问service1,zuul会自动分发请求到这两个相同的service。以上就是基于zuul和eureka实现的最基本的负载均衡功能,是否很简单呢?

May 27, 2020 · 1 min · jiezi