
能力说明:
精通JVM运行机制,包括类生命、内存模型、垃圾回收及JVM常见参数;能够熟练使用Runnable接口创建线程和使用ExecutorService并发执行任务、识别潜在的死锁线程问题;能够使用Synchronized关键字和atomic包控制线程的执行顺序,使用并行Fork/Join框架;能过开发使用原始版本函数式接口的代码。
暂时未有相关云产品技术能力~
阿里云技能认证
详细说明Ribbon饥饿加载 默认情况下Ribbon是懒加载的。当服务起动好之后,第一次请求是非常慢的,第二次之后就快很多。 解决方式:开启饥饿加载 ribbon: eager-load: enabled: true #开启饥饿加载 clients: server-1,server-2,server-3 #为哪些服务的名称开启饥饿加载,多个用逗号分隔 Ribbon组成 接口 作用 默认值 IclientConfig 读取配置 DefaultClientConfigImpl IRule 负载均衡规则,选择实例 ZoneAvoidanceRule IPing 筛选掉ping不通的实例 DumyPing(该类什么不干,认为每个实例都可用,都能ping通) ServerList<Server> 交给Ribbon的实例列表 Ribbon:ConfigurationBasedServerListSpring Cloud Alibaba:NacosServerList ServerListFilter<Server> 过滤掉不符合条件的实例 ZonePreferenceServerListFilter ILoadBalancer Ribbon的入口 ZoneAwareLoadBalancer ServerListUpdater 更新交给Ribbon的List的策略 PollingServerListUpdater 这里的每一项都可以自定义IclientConfigRibbon支持非常灵活的配置就是由该组件提供的IRule为Ribbon提供规则,从而选择实例、该组件是最核心的组件举例:代码方式 @Configuration public class RibbonRuleConfig { @Bean public IRule ribbonRulr() { return new RandomRule(); } @Bean public IPing iPing(){ return new PingUrl(); } } 配置属性方式 <clientName>: ribbon: NFLoadBalancerClassName: #ILoadBalancer该接口实现类 NFLoadBalancerRuleClassName: #IRule该接口实现类 NFLoadBalancerPingClassName: #Iping该接口实现类 NIWSServerListClassName: #ServerList该接口实现类 NIWSServerListFilterClassName: #ServiceListFilter该接口实现类 在这些属性中定义的类优先于使用@RibbonClient(configuration=RibbonConfig.class)Spring 定义的bean 以及由Spring Cloud Netflix提供的默认值。描述:配置文件中定义ribbon优先代码定义 Ribbon负载均衡的八种算法,其中ResponseTimeWeightedRule已废除 规则名称 特点 AvailabilityFilteringRule 过滤掉一直连接失败的被标记为circuit tripped(电路跳闸)的后端Service,并过滤掉那些高并发的后端Server或者使用一个AvailabilityPredicate来包含过滤Server的逻辑,其实就是检查status的记录的各个Server的运行状态 BestAvailableRule 选择一个最小的并发请求的Server,逐个考察Server,如果Server被tripped了,则跳过 RandomRule 随机选择一个Server ResponseTimeWeightedRule 已废弃,作用同WeightedResponseTimeRule RetryRule 对选定的负责均衡策略机上充值机制,在一个配置时间段内当选择Server不成功,则一直尝试使用subRule的方式选择一个可用的Server RoundRobinRule 轮询选择,轮询index,选择index对应位置Server WeightedResponseTimeRule 根据相应时间加权,相应时间越长,权重越小,被选中的可能性越低 ZoneAvoidanceRule (默认是这个)负责判断Server所Zone的性能和Server的可用性选择Server,在没有Zone的环境下,类似于轮询(RoundRobinRule) 实现负载均衡<细粒度>配置-随机 方式一:JAVA代码方式 首先定义RestTemplate,并且添加注解@LoadBalanced,这样RestTemplate就实现了负载均衡 @LoadBalanced @Bean public RestTemplate restTemplate() { //template.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));//解决中文乱码 return new RestTemplate(); } 在SpringBootApplication主类下添加配置类。该类主要作用于为哪个服务做负载均衡。默认的是轮训 @Configuration @RibbonClient(name = "${服务名称}", configuration = GoodsRibbonRuleConfig.class)//configuration: 指向负载均衡规则的配置类 public class GoodsRibbonConfig { } 添加Ribbon的配置类,注意该类必须配置在@SpringBootApplication主类以外的包下。不然的话所有的服务都会按照这个规则来实现。会被所有的RibbonClient共享。主要是主类的主上下文和Ribbon的子上下文起冲突了。父子上下文不能重叠。相关连接:https://blog.csdn.net/qq_32588349/article/details/52097943 @Configuration public class GoodsRibbonRuleConfig { @Bean public IRule ribbonRulr() { return new RandomRule(); } } 或者使用自定义注解排除该类 方式一:配置属性方式 server-1: # 服务名称 Service-ID ribbon: # 属性配置方式【推荐】 NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 配置文件配置负载均衡算法-我这里使用的是自定义的Ribbon的负载均衡算法,默认 优先级:配置(不会影响其他服务)>(大于) 硬编码(类得写在SpringBoot启动类包外,不然会影响其他服务) 总结: 配置方式 有点 缺点 代码配置 基于代码,更加灵活 有坑(父子上下文) 线上修改得重新打包,发布 属性配置 易上手 配置更加直观 线上修改无需重新打包,发布 优先级更高 极端场景下没有配置配置方式灵活 实现负载均衡<全局>配置-随机 方式一:Ribbon的配置类定义在主类下 让ComponentScan上下文重叠(强烈不建议使用) 方式二: @Configuration @RibbonClients(defaultConfiguration = GoodsRibbonRuleConfig.class)//Ribbon负载均衡全局粒度配置(所有服务都按照这个配置) public class RibbonConfig { }
正常版本 <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.7.RELEASE</version> <!--语义化版本--> <!--2:主版本,第几代版本--> <!--1:次版本,一些功能的增加,但是架构没有变化,是兼容的--> <!--7:增量版本,BUG修复--> <!--RELEASE:里程碑-正式版,SNAPHOT:开发版,M:发布之前设计几个里程碑版本,M版本之后是RELEASE--> SpringCloud 版本 Release Trains(发布列车) 为了避免与子项目混淆,发布火车有名称,而没有版本。这些名字是按字母顺序排列的(所以你可以按时间顺序排列),还有伦敦地铁站的名字(“Angel”是第一个版本,“Brixton”是第二个版本)。当单个项目的点发布累积到一个临界量时,或者如果其中有一个临界bug需要对所有人可用,那么发布序列将推出名称以“service release”结尾的“服务发布”。,其中“X”是一个数字。 Hoxton(第8代) Greenwich(第7代) Finchley(第6代) Edgware(第5代) Dalston(第一4) Cxxx(第3代) Bxxx(第2代) Axxx(第1代) Greenwich.SR2,SR2表示Service Release bug修复,2:第几次 Greenwich.Release Greenwich版本的第一个正式版 Greenwich.SR1 Greenwich版本的第一个bug修复版 发布顺序 Greenwich.Release ---> Greenwich.SR1 ---> Greenwich.SR2
首先遵循SpringBoot的三板斧 第一步添加依赖 <!-- SwaggerUI 接口文档 http://{ip}:{prot}/swagger-ui.html --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>{version}</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>{version}</version> </dependency> 第二步添加注解 @EnableSwagger2 //启动SwaggerUI,在启动类或Swagger配置类上添加该注解 第三步写配置 @Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket api() { /* //可以添加多个header或参数 ParameterBuilder aParameterBuilder = new ParameterBuilder(); aParameterBuilder //参数类型支持header, cookie, body, query etc .parameterType("header") //参数名 .name("user-token") //默认值 .defaultValue("t122222") .description("用户登录凭证") //指定参数值的类型 .modelRef(new ModelRef("string")) //非必需,这里是全局配置 .required(false).build(); List<Parameter> aParameters = new ArrayList<>(); aParameters.add(aParameterBuilder.build()); */ return new Docket(DocumentationType.SWAGGER_2) // return new Docket(DocumentationType.SPRING_WEB) .apiInfo(apiInfo()) .pathMapping("/") .select()// 选择那些路径和api会生成document .apis(RequestHandlerSelectors.any())// 对所有api进行监控 // 不显示错误的接口地址 .paths(Predicates.not(PathSelectors.regex("/error.*")))// 错误error路径不监控 .paths(Predicates.not(PathSelectors.regex("/actuator.*")))// 错误error路径不监控 .paths(PathSelectors.regex("/.*"))// 对根下所有路径进行监控 .paths(PathSelectors.any()) // 对所有路径进行监控 // 自行修改为自己的包路径 // .apis(RequestHandlerSelectors.basePackage("com.happyloves.zc.service.account.api")) .build() // .globalOperationParameters(aParameters) .enable(true); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("API接口") .description("API接口文档") //服务条款网址 // .termsOfServiceUrl("https://www.google.com") .version("1.0") // .contact(new Contact("啦啦啦", "url", "email")) .build(); } } 扩展:swagger-bootstrap-ui是springfox-swagger的增强UI实现,为Java开发者在使用Swagger的时候,能拥有一份简洁、强大的接口文档体验项目地址码云:https://gitee.com/xiaoym/swagger-bootstrap-ui GitHub:https://github.com/xiaoymin/Swagger-Bootstrap-UI 在线体验:http://swagger-bootstrap-ui.xiaominfo.com/doc.html 项目文档:http://www.xiaominfo.com/swagger-bootstrap-ui/ 代码集成示例 SpringBoot在线demo地址:https://gitee.com/xiaoym/swagger-bootstrap-ui-demo Spring Mvc在线demo地址:https://gitee.com/xiaoym/swagger-bootstrap-ui-demo/tree/master/swagger-bootstrap-ui-demo-mvc 添加依赖 <!-- swagger-bootstrap-ui是 Swagger 的增强UI 实现,使文档更友好一点儿 http://{ip}:{prot}/doc.html --> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>swagger-bootstrap-ui</artifactId> <version>1.9.6</version> </dependency>
2020年08月