石家庄云图网站建设,哈尔滨公司做网站,南昌网站建设咨询,英文网站如何建设开源地址#xff1a;
ma/springcloud-alibaba-demo 简介
参考#xff1a;https://www.cnblogs.com/zys2019/p/12682628.html
SpringBoot、SpringCloud 、SpringCloud Alibaba 以及各种组件存在版本对应关系。可参考下面
版本对应 项目前期准备
启动nacos. ./startup.c…开源地址
ma/springcloud-alibaba-demo 简介
参考https://www.cnblogs.com/zys2019/p/12682628.html
SpringBoot、SpringCloud 、SpringCloud Alibaba 以及各种组件存在版本对应关系。可参考下面
版本对应 项目前期准备
启动nacos. ./startup.cmd -m standalone
登陆nacos官方 localhost:8848 nacos/nacos
创建父工程spring-cloud-alibaba
pom.xml如下
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.lgc/groupIdartifactIdspring-cloud-alibaba/artifactIdversion1.0-SNAPSHOT/versionpackagingpom/packagingmodulesmodulecloud-alibaba-consumer80/modulemodulecloud-alibaba-provider8081/modulemodulecloud-alibaba-provider8082/modulemodulecloud-alibaba-sentinel/modulemodulecloud-alibaba-config-client/modulemodulecloud-alibaba-getway/module/modulespropertiesproject.build.sourceEncodingUTF-8/project.build.sourceEncodingmaven.compiler.source1.8/maven.compiler.sourcemaven.compiler.target1.8/maven.compiler.targetspring.boot.version2.2.2.RELEASE/spring.boot.versionspring.cloud.alibaba.version2.2.0.RELEASE/spring.cloud.alibaba.versionspring.cloud.versionHoxton.SR1/spring.cloud.version/properties!-- 依赖管理父工程锁定版本--dependencyManagementdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion${spring.boot.version}/versiontypepom/typescopeimport/scope/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion${spring.cloud.alibaba.version}/versiontypepom/typescopeimport/scope/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion${spring.cloud.version}/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagementbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdconfiguration!--forktrue/fork--addResourcestrue/addResources/configuration/plugin/plugins/build
/projectNacos
Nacos集成了Ribbon实现了负载均衡。
创建服务提供者子模块cloud-alibaba-provider8001
pom.xml如下
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdcom.lgc/groupIdartifactIdspring-cloud-alibaba/artifactIdversion1.0-SNAPSHOT/version/parentartifactIdcloud-alibaba-provider8081/artifactIddependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependency!--springcloud alibaba nacos--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependency/dependencies/projectapplication.yml如下
server:port: 8001
spring:application:name: cloud-alibaba-nacos-providercloud:nacos:server-addr: 127.0.0.1:8848discovery:server-addr: ${spring.cloud.nacos.server-addr}
management:endpoints:web:exposure:include: * 其中management这一段是属于端口暴露
创建启动类
SpringBootApplication
EnableDiscoveryClient
public class CloudAlibabaProvider8081Application {public static void main(String[] args) {SpringApplication.run(CloudAlibabaProvider8081Application.class, args);}}
Nacos注册服务需要在启动类中加上EnableDiscoveryClient,意思就是服务注册发现
创建controller接口
RestController
public class UserController {Value(${server.port})private int port;GetMapping(/user/get)public String get(){return provider port is :port;}
}
这样去取server.port是从application.yml去取。
启动服务提供者在nacos界面上就能看到服务已经注册进来了。 同理创建cloud-alibaba-provider8002,端口为8002.启动后发现nacos的集群的实例数为2. OpenFeign
创建服务调用实例
创建服务消费者子模块cloud-alibaba-consumer80
pom.xml如下
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdcom.lgc/groupIdartifactIdspring-cloud-alibaba/artifactIdversion1.0-SNAPSHOT/version/parentversion1.0-SNAPSHOT/versionartifactIdcloud-alibaba-consumer80/artifactIddependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependency!--springcloud alibaba nacos--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependency!--feign--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependency/dependencies/projectapplication.yml如下
server:port: 80
spring:application:name: cloud-alibaba-nacos-consumercloud:nacos:server-addr: 127.0.0.1:8848discovery:server-addr: ${spring.cloud.nacos.server-addr}
feign:client:#指定全局default:#连接超时时间connectTimeout: 5000#服务等待时间readTimeout: 5000loggerLevel: full
logging:level:com.lgc.cloudalibabaconsumer80.client: debug需要把consumer这个服务也放到nacos中就像把这些服务放到一个大容器中大容器的服务之间可以相互调用、
创建启动类
SpringBootApplication
EnableDiscoveryClient
EnableFeignClients
public class CloudAlibabaConsumer80Application {public static void main(String[] args) {SpringApplication.run(CloudAlibabaConsumer80Application.class, args);}}
EnableFeignClients这个代表当前服务作为OpenFeign客户端。
创建Client接口用于端口映射可以调用其他服务中的接口接口在其他服务中已存在
FeignClient(value cloud-alibaba-nacos-provider)
public interface UserClient {GetMapping(/user/get)String get();
}FeignClient中 的Value值为目标服务的名字也就是目标服务的spring.application.name
接口的路由也得对应上目标服务的请求url,也就是说cloud-alibaba-nacos-provider的controller中也有个/user/get的接口才可以。
创建controller
RestController
RequestMapping(/consumer)
public class UserController {Autowiredprivate UserClient userClient;GetMapping(/get)public String get() {return userClient.get();}
}
启动服务在nacos中就可以看到 访问localhost:80/consumer/get,看到的是8001和8002在进行轮训负载因为nacos默认支持负载均衡原因是他默认引入了ribbon.
为了引入nacos的动态参数我们新建一个cloud-alibaba-config-client模块pom.xml如下
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentartifactIdspring-cloud-alibaba/artifactIdgroupIdcom.lgc/groupIdversion1.0-SNAPSHOT/version/parentartifactIdcloud-alibaba-config-client/artifactIddependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependency!--springcloud alibaba nacos--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactId/dependency/dependencies
/project新建bootstrap.yml:系统级别的配置主要配置配置中心的相关信息优先加载
spring:cloud:nacos:server-addr: 127.0.0.1:8848discovery:server-addr: ${spring.cloud.nacos.server-addr}config:server-addr: ${spring.cloud.nacos.server-addr}file-extension: yamlgroup: DEFAULT_GROUP#namespace: 5a2f851c-8639-4acb-98f1-d5e76cd46457
management:endpoints:web:exposure:include: * 值得一提的是namespace填的是Id而不是你新建的命名空间的汉字名称。
application.yml如下
spring:application:name: nacos-config-clientprofiles:
# active: dev #开发环境
# active: test 测试环境active: info #info??注意一下这里的profiles选的是info级别那么在加载nacos的配置文件的时候是以info为后缀的。
创建启动类 SpringBootApplication
EnableDiscoveryClient
public class CloudAlibabaConfigClientApplication {public static void main(String[] args) {SpringApplication.run(CloudAlibabaConfigClientApplication.class, args);}}
创建controller接口
RestController
RefreshScope //类上加了RefreshScope注解用于自动刷新。若不添加则无法进行自动的配置刷新
public class UserController {Value(${config.info})private String info;GetMapping(/config/get)public String get() {return The config info is : info;}
}RefreshScope用于参数的自动刷新如果你nacos中的配置更改能够自动同步过来不需要再重启服务。
nacos中的配置文件命名规则为${prefix}-${spring.profile.active}.${file-extension}。
prefix 默认为 spring.application.name 的值也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
spring.profile.active 即为当前环境对应的 profile。
file-exetension 为配置内容的数据格式可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。假如spring.application.namenacos-config-client环境为dev后缀名是yaml那么dataID就是nacos-config-client-dev.yaml。这里不存在主/从配置文件的说法只指定不同环境的配置公共的配置都放在自己的环境中。另外dataId后缀必须是yaml或properties。 测试
启动3344访问http://localhost:3344/config/get可以看到配置的信息。然后修改配置中的config.info内容再刷新页面发现配置信息也更新了。此时就做到了配置实时刷新。
Gatway
新建cloud-alibaba-gatway模块
pom.xml如下
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdcom.lgc/groupIdartifactIdspring-cloud-alibaba/artifactIdversion1.0-SNAPSHOT/version/parentartifactIdcloud-alibaba-getway/artifactIddependenciesdependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependency!--服务网关--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-gateway/artifactId/dependency/dependencies/projectapplication.yml如下
server:port: 7001
spring:application:name: cloud-gateway-servicecloud:nacos:server-addr: localhost:8848discovery:server-addr: ${spring.cloud.nacos.server-addr}#namespace: 5a2f851c-8639-4acb-98f1-d5e76cd46457gateway:routes:- id: provideuri: lb://cloud-alibaba-nacos-providerpredicates:- Path/user/**- id: consumeruri: lb://cloud-alibaba-nacos-consumerpredicates:- Path/consumer/**
management:endpoints:web:exposure:include: * lb:代表loadbalance负载均衡
lb://cloud-alibaba-nacos-provider 目标cloud-alibaba-nacos-provider服务
拦截请求/user/** 拦截/user下的所有请求指向cloud-alibaba-nacos-provider服务。
创建启动类
SpringBootApplication
public class CloudAlibabaGetwayApplication {public static void main(String[] args) {SpringApplication.run(CloudAlibabaGetwayApplication.class, args);}}
Sentinel
下载地址Releases · alibaba/Sentinel · GitHub选择对应的版本下载即可。这里以1.8.2版本为例 可以下载压缩包也可以直接下载jar。本章节在Windows中说明就直接下载jar进行说明。
下载到本地执行
java -jar sentinel-dashboard-1.7.2.jar
在浏览器访问http://localhost:8080 sentinel/sentinel 登录后看到仪表盘是空的因为现在没有监控任何的服务。
创建cloud-alibaba-sentinel模块
pom.xml如下
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentartifactIdspring-cloud-alibaba/artifactIdgroupIdcom.lgc/groupIdversion1.0-SNAPSHOT/version/parentartifactIdcloud-alibaba-sentinel/artifactIddependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependency!--springcloud alibaba nacos--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependency!--springcloud alibaba sentinel--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactId/dependency!--springcloud alibaba sentinel-datasource-nacos--dependencygroupIdcom.alibaba.csp/groupIdartifactIdsentinel-datasource-nacos/artifactId/dependency/dependencies/projectapplication.yml如下
server:port: 8401
spring:application:name: cloud-alibaba-sentinel-servicecloud:nacos:server-addr: 127.0.0.1:8848discovery:server-addr: ${spring.cloud.nacos.server-addr}sentinel:transport:# sentinel dashboard的地址dashboard: 127.0.0.1:8080# sentinel dashboard内部通信端口默认为8719如果被占用会自动1直到找到为止port: 8719management:endpoints:web:exposure:include: *
创建启动类
SpringBootApplication
EnableDiscoveryClient
public class CloudAlibabaSentinelApplication {public static void main(String[] args) {SpringApplication.run(CloudAlibabaSentinelApplication.class, args);}}
创建controller package com.zys.cloud.controller;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;RestController
public class FlowLimitController {GetMapping(/testA)public String testA(){return --------testA;}GetMapping(/testB)public String testB(){return --------testB;}}
测试。先启动nacos服务再启动sentinel服务再启动8401。访问http://localhost:8401/testA后会在仪表盘看到生成了一个服务 主要讲解流控熔断热点授权
其中QBS表示1秒的请求数QPS表示1秒的拒绝请求数。
流控
流量控制flow control)其原理是监控应用流量的QPS或并发线程数等指标当达到指定的阈值时对流量进行控制以避免被瞬时的流量高峰冲垮从而保障应用的高可用性。
QPS表示每秒的请求数。可在簇点链路中选择链路的点击流控按钮添加也可在流控规则中添加。其他的功能类似。这里以/testA的流控为例 上图的配置也就是说对于请求/testA当每秒请求的次数超过阈值那么会直接返回失败的信息。保存后显示列表如下 访问localhost:8401/testA结果是正常的若快速的刷新几次会发现返回了流控的信息 对于针对来源默认使用default那么也可以指定来源那么当指定的这个来源调用/testA请求时会进行流控其他服务调用/testA时不进行流控也就是对来源进行针对性的流控。 也可设置并发线程的阈值当某一时刻并发线程数量超过时会进行流控。 使用Jmeter对/testA发送超过阈值的并发请求那么在发送的同时再访问/testA就会出现流控。 流控模式-关联言简意赅两个服务共同参与限制条件原来是AC,现在是ABC
1说明前面的两种的流程模式都设置为直接这种模式是默认的也就是说流量控制规则到达阈值时直接触发流量控制。本小节说明关联模式均以QPS类型说明后同。
2关联当两个资源之间具有资源争抢或者依赖关系的时候这两个资源便具有了关联。比如对数据库同一个字段的读操作和写操作存在争抢读的速度过高会影响写得速度写的速度过高会影响读的速度。如果放任读写操作争抢资源则争抢本身带来的开销会降低整体的吞吐量。关联的关系是反向关联。
3上述代码中的/testA和/testB就是关联关系它们在同一个controller中占用相同的资源编辑配置如下 使用Jmeter对/testB发送超过阈值的并发请求那么在发送的同时再访问/testA就会出现流控。原因是两个请求相互争抢资源进行了流控。
流控模式-链路:
链路模式也就是对某一条链路进行流控。如用户服务会调用订单服务商品服务也会调用订单服务就存在两条链路。在某个时刻对商品服务-订单服务这条链路进行流控从而保证订单服务的正常使用最终让用户服务可以正常调用订单服务虽然限流了商品服务这条链路但不影响用户服务这条链路。
流控效果-快速失败:
默认的流量控制方式当QPS超过任意规则的阈值后新的请求就会被立即拒绝拒绝方式为抛出FlowException。前面已经使用过多次。
流控效果-Warm Up
预热/冷启动方式。当系统长期处于低水位的情况下当流量突然增加时直接把系统拉升到高水位可能瞬间把系统压垮。通过冷启动让通过的流量缓慢增加在一定时间内逐渐增加到阈值上限给冷系统一个预热的时间避免冷系统被压垮。它有一个冷加载因子值是3。曲线图如下 新加/testA的流控规则如下 当1秒同时有20个请求预热时间是10秒。那么服务会先处理7个请求20/3后面依次处理当达到20秒时处理完所有的请求。
流控效果-排队等待
让请求以均匀的速度通过。修改/testA的规则 也就是说当有大量的请求来时每秒只处理20个请求其他的请求进行排队等待依次类推。当后面排队的时间超过5秒时就报错显示流控信息。
熔断降级
一个服务常常会调用别的模块如果依赖的服务出现了不稳定的情况请求的响应时间变长那么调用服务的方法的响应时间也会变长线程会产生堆积最终可能耗尽业务自身的线程池服务本身也变得不可用。而Sentinel在服务出现不稳定情况时会对其进行限制请求快速失败避免影响到其他资源而导致级联错误。当资源被降级后在接下来的时间窗口内对该资源的调用都自动熔断。
1慢调用比例当单位统计时长内请求数目大于设置的最小请求数目并且平均响应时间超过最大RT的请求的比例大于阈值则接下来的熔断时长内请求会自动被熔断。
经过熔断时长后熔断器会进入探测恢复状态若接下来的一个请求成功完成则结束熔断否则会再次被熔断。 说明在1000ms内请求数超过5个且平均响应时间超过300ms的请求的比例超过300ms的请求占总请求的比例大于0.4则该资源自动熔断10s。10s后根据下一个请求判断是否再次被熔断。
2异常比例当单位统计时长内请求数目大于设置的最小请求数目并且异常的比例大于阈值则接下来的熔断时长内请求会自动被熔断。
经过熔断时长后熔断器会进入探测恢复状态若接下来的一个请求成功完成则结束熔断否则会再次被熔断。 说明在1000ms内请求数超过5个且异常的请求超过6个那么该资源将自动熔断20s。20s后根据下一个请求判断是否再次被熔断。
SentinelResource的使用
前面的所讲的流控或降级其返回的数据都是 Blocked by Sentinel (flow limiting) 当然可以自定义。SentinelResource和HystrixCommand的作用是类似的都是来指定流控或降级时返回的信息。
在方法上加SentinelResource注解且使用blockHandler或者blockHandlerClass指定流控或降级时的自定义提示而blockHandler函数访问范围需要是public返回类型需要与原方法相匹配参数类型需要和原方法相匹配并且最后加一个额外的参数(类型是BlockException)且和原方法在同一个类中。使用fallback 指定未流控或降级发生异常时的自定义提示其方法必须是public返回类型需要与原方法相匹配参数类型需要和原方法相匹配。
下面通过对/testC进行流控和降级来说明
1流控配置 2降级配置 修改controller
package com.lgc.cloudalibabasentinel.controller;import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;RestController
public class FlowLimitController{GetMapping(/testA)public String testA(){return --------testA;}GetMapping(/testB)public String testB(){return --------testB;}GetMapping(/testC)SentinelResource(value aaa,blockHandler testCBlockHandler,fallback testCFallback)public String testC(Integer id){if (id 0) {throw new RuntimeException(参数值格式错误);}return --------testC;}//自定义降级或熔断时的提示信息public String testCBlockHandler(Integer id, BlockException exception){//判断异常的类型if (exception instanceof FlowException){return 你被限流了请稍后再试;} else if (exception instanceof DegradeException) {return 你被降级了请稍后再试;}return 当前服务不可用;}//自定义未限流时发生 异常 的提示信息public String testCFallback(Integer id){return 参数不合法;}
}在SentinelResource指定了value其值就是要流控或降级的资源名必须配置。
当访问/testC?id8时快速刷新会出现流控提示信息。
当问/testC?id-5时刷新1此会出现错误提示信息。
当问/testC?id-5时刷新5次以上会出现降级提示信息。
规则持久化
每次无论重启sentinel服务还是要监控的服务sentinel页面的配置规则都会消失这是因为这些规则没有持久化对应大量的配置规则持久化也非常重要可将其配置到nacos中。
这里直接在cloud-alibaba-sentinel模块进行说明
1)导入依赖 !--springcloud alibaba sentinel-datasource-nacos--dependencygroupIdcom.alibaba.csp/groupIdartifactIdsentinel-datasource-nacos/artifactId/dependency
2在yml配置已存在配置省略
spring:cloud:# 流控规则持久化到nacosdatasource:dsl:nacos:server-addr: ${spring.cloud.nacos.server-addr}data-id: ${spring.application.name}group-id: DEFAULT_GROUPdata-type: jsonrule-type: flow
3在nacos中添加配置文件如下图 json内容
[{resource: /testA,limitApp: default,grade: 1,count: 5,strategy: 0,controlBehavior: 0,clusterMode: false}
]
可看到json中是一个数组数组中只有一个元素那么针对/test的请求的配置规则会存下来不会因为重启而丢失而其他的请求的配置规则还是丢失。针对这些请求都按照这种规则配置在数组中即可。