sb2.0新版springcloud微服务实战:Eureka+Zuul+Feign/Ribbon+Hystrix Turbine+SpringConfig+sleuth+zipkin

springboot 版本是 2.0.3.RELEASE ,springcloud 版本是 Finchley.RELEASE

本篇文章是springboot2.x升级后的升级springcloud专贴,因为之前版本更新已经好久了,好多人评论可不可以出个新版本,大家一定要注意,这是springboot2.x版本的,springboot1.x的请参考 点击查看文章,基本组件都不变就是升级jar包版本,主要就是hystrix-dashboard使用有点变化。还有一点要注意的是sc默认使用的是eureka1.9.x版本,大家一定要主要,不要自己手动改为2.x版本,因为2.x版本还没有正式发布,而且停止开发了,官方还在积极的维护1.x版本(并不是网传的闭源)。

相信现在已经有很多小伙伴已经或者准备使用springcloud微服务了,接下来为大家搭建一个微服务框架,后期可以自己进行扩展。会提供一个小案例: 服务提供者和服务消费者 ,消费者会调用提供者的服务,新建的项目都是用springboot,附×××,推荐使用coding地址下载,因为可以切换分支,后期可以及时更新。

coding仓库地址(推荐下载): coding地址 远程配置仓库地址 远程配置仓库地址

如果有问题请在下边评论,或者200909980加×××流。或者关注文章结尾微信公众号,私信后台

Eureka/Consul/Zookeeper:服务发现 (根据情况选择一个,eureka已经宣布闭源)

Hystrix:断路器

Zuul:智能路由

Ribbon/Feign:客户端负载均衡 (Feign用的更多)

Turbine&hystrix-dashboard:集群监控

Springcloud-config:远程获取配置文件

接下来,我们开始搭建项目,首先我们到spring为我们提供的一个网站快速搭建springboot项目,点击访问,我这里用的是gradle,如果各位客官喜欢用maven,好吧你可以到http://mvnrepository.com/查看对应的依赖,点我访问。

1.png

一、搭建eureka-server服务sc-eureka-server

使用 spring-cloud-consul 作为服务发现 请参考 点击查看使用springcloud consul 作为服务发现

eureka-server作为服务发现的核心,第一个搭建,后面的服务都要注册到eureka-server上,意思是告诉eureka-server自己的服务地址是啥。当然还可以用zookeeper或者springconsul。

1.修改build.gradle文件
如果是maven项目请对应的修改pom.xml

//加入阿里的私服仓库地址
maven { url "http://maven.aliyun.com/nexus/content/groups/public/" }
//加入依赖
compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-server')
//加入security,是因为访问eureka-server需要用户名和密码访问,为了安全
compile('org.springframework.boot:spring-boot-starter-security')
还有几点需要修改的,大家对应图片看看,就是springboot打包的时候会提示找不到主类。

2.png

2.修改 application.yml,建议用yml。
server:
port: 8761
eureka:
datacenter: trmap
environment: product
server:

关闭自我保护

enable-self-preservation: false

清理服务器

eviction-interval-timer-in-ms: 5000
client:
healthcheck:
enabled: true
service-url:
defaultZone: http://root:booszy@localhost:8761/eureka/
register-with-eureka: false
fetch-registry: false
spring:
security:
basic:
enabled: true
user:
name: root
password: booszy
3.修改程序的主类,建议修改类名,要加如eureka的 @EnableEurekaServer 注解,然后运行main方法。br/>@EnableEurekaServer
@SpringBootApplication
public class Sb2scEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(Sb2scEurekaApplication.class, args);
}
}

4.png

http://localhost:8761/ 这个是eureka-server的页面地址,密码在yml配置文件中,到这里,说明eureka-server搭建好了,简单吧,这一步一定要成功,否则后面的就不能继续进行下去了,后边基本类似。

二、搭建config-server服务sc-config-server

springcloud-config-server是用来将远程git仓库的配置文件动态拉下来,这样配置文件就可以动态的维护了。当然也可以选择本地仓库。

新建一个springboot项目,修改maven私服地址,并加入一下依赖。

1.修改build.gradle文件
compile('org.springframework.cloud:spring-cloud-config-server')
compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
//连接config-server也需要用户名和密码
compile('org.springframework.boot:spring-boot-starter-security')
compile('org.springframework.boot:spring-boot-starter-actuator')
2.修改application.yml文件
server:
port: 8800
spring:
security:
basic:
enabled: true
user:
name: root
password: booszy
application:
name: sc-config-server
cloud:
config:
server:
git:
uri: https://git.coding.net/yirenyishi/springcloud-config-profile
searchPaths: '{application}'
eureka:
client:
service-url:
defaultZone: http://root:booszy@localhost:8761/eureka/
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}
appname: sc-config-server
3.修改启动类
修改启动类,要加入这三个注解,因为要注册到eureka-server上,所以需要@EnableDiscoveryClient这个注解

@EnableConfigServer

@EnableDiscoveryClient

@SpringBootApplication

public class Sb2scConfigApplication {

public static void main(String[] args) {

SpringApplication.run(Sb2scConfigApplication.class, args);

}

}

然后运行启动springboot项目,等启动成功后访问eureka的页面,会发现sc-config-server已经注册到上面了,如果启动报错,请检查错误信息。

3.png

三、搭建服务提供者服务sc-provider

编写一个服务提供者,为下边的消费者提供服务,用到了spring-webflux(spring新出的非阻塞式框架)不是springmvc,当然你们公司用什么你还是继续用什么。

注意 : 这里除了application.xml,还需要一个bootstrap.yml, 因为bootstrap.yml得加载顺序是在application.xml前边,服务注册和config配置必须放到bootstrap.yml。
修改build.gradle文件
compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
compile('org.springframework.cloud:spring-cloud-starter-config')
compile('org.springframework.boot:spring-boot-starter-webflux')
compile('org.springframework.boot:spring-boot-starter-actuator')
2.编写配置文件bootstrap.yml
* 注意 : 这里除了application.xml,还需要一个bootstrap.yml

application.xml我是放到远程仓库地址的,大家可以直接到我的远程仓库,根据项目名(sc-provider-config)查询。配置文件的仓库地址:点击访问。

eureka:
client:
service-url:
defaultZone: http://root:booszy@localhost:8761/eureka/
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}
appname: sc-provider
spring:
application:
name: sc-provider
cloud:
config:
discovery:
enabled: true
service-id: sc-config-server
fail-fast: true
username: root
password: booszy
profile: csdn
3.编写代码
编写主类

@EnableDiscoveryClientbr/>@SpringBootApplication
public class Sb2scProviderApplication {
public static void main(String[] args) {
SpringApplication.run(Sb2scProviderApplication.class, args);
}
}
新建IndexController进行测试,这里只是为了测试,案例代码使用的是webflux,如果想使用springmvc,修改jar包依赖即可。

@RestControllerbr/>@RequestMapping("test")
public class IndexController {br/>//返回一个实体
@GetMapping("{msg}")
public Mono<String> sayHelloWorld(@PathVariable("msg") String msg) {
System.out.println("come on " + msg);
return Mono.just("sc-provider receive : " +msg);br/>}
//返回一个列表
@GetMapping("list")
public Flux<Integer> list() {
List<Integer> list = new ArrayList<>();
list.add(8);
list.add(22);
list.add(75);
list.add(93);
Flux<Integer> userFlux = Flux.fromIterable(list);
return userFlux;
}
}
运行springboot项目,去eureka-server查看,有没有注册上。

5.png

我们的sc-provider已经注册到eureka上了,访问接口,成功。

6.png

四、搭建消费者服务sc-consumer

消费者要访问服务提供者的服务,这里用的是通过RestTemplate/feign请求resetful接口,使用ribbon做客户端负载均衡,hystrix做错误处理,feign和ribbon二选一,案例中ribbon和feign都有,也可以都用。

还是熟悉的配方,熟悉的味道,新建springboot项目,添加项目依赖。

1.修改build.gradle文件
compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
compile('org.springframework.cloud:spring-cloud-starter-config')
compile('org.springframework.boot:spring-boot-starter-webflux')
compile('org.springframework.boot:spring-boot-starter-actuator')
compile('org.springframework.cloud:spring-cloud-starter-openfeign')
compile('org.springframework.cloud:spring-cloud-starter-netflix-hystrix')
2.修改bootstrap.yml文件
application.yml 在git仓库,请前往git仓库查看。

eureka:
client:
service-url:
defaultZone: http://root:booszy@localhost:8761/eureka/
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}
appname: sc-consumer
spring:
application:
name: sc-consumer
cloud:
config:
discovery:
enabled: true
service-id: sc-config-server
fail-fast: true
username: root
password: booszy
profile: csdn
#新版配置,否则后面dashboard无法找到hystrix.stream
management:
endpoints:
web:
exposure:
include: '*'
3.编写代码
启动类代码

@RibbonClient 指定服务使用的负载均衡类型,name不指定服务则为所有的服务打开负载均衡,也可以在用yml中进行配置。

@EnableHystrix 是支持hystrix打开断路器,在规定时间内失败参数超过一定参数,就会打开断路器,不会发起请求,而是直接进入到错误处理方法。

@EnableDiscoveryClientbr/>@EnableFeignClients
@EnableCircuitBreakerbr/>@EnableHystrix
@SpringBootApplication
public class Sb2scConsumerApplication {
// ribbon需要配置,负载均衡br/>@Autowired
private RestTemplateBuilder builder;
// ribbon需要配置,负载均衡br/>@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return builder.build();
}
public static void main(String[] args) {
SpringApplication.run(Sb2scConsumerApplication.class, args);
}
}
1.ribbon案例

ribbon不需要单独依赖,新建 RibbonController

ribbon一个坑,不能接受List类型,要使用数组接收。

@HystrixCommand(fallbackMethod="fallbackMethod")

如果请求失败,会进入fallbackMethod这个方法,fallbackMethod这个方法要求参数和返回值与回调他的方法保持一致。

@RestController
public class RibbonController {br/>@Autowired
private RestTemplate restTemplate;br/>@Autowired
private LoadBalancerClient loadBalancerClient;br/>@GetMapping("/ribbon/{wd}")
@HystrixCommand(fallbackMethod="fallbackMethod")
public Mono<String> sayHelloWorld(@PathVariable("wd") String parm) {
String res = this.restTemplate.getForObject("http://sc-provider/test/" + parm, String.class);
return Mono.just(res);
}
public Mono<String> fallbackMethod(@PathVariable("wd") String parm) {
return Mono.just("fallback");
}
运行springboot项目,先看有没有注册到eureka-server上。

7.png

注册成功后,访问接口,测试是否正确。

8.png

ribbon使用就是这么简单,ribbon是springboot自带,所以不需要单独添加依赖。

2.feign案例

在实际开发中,feign使用的还是挺多的,feign底层还是使用了ribbon。废话不多说,直接上步骤,在服务消费者中使用feign访问服务提供者。

1配置文件
ribbon:
ReadTimeout: 30000
ConnectTimeout: 15000
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 10000
feign的默认请求超时时间是1s,所以经常会出现超时的问题,这里我设置的是10s,因为我的数据库服务器在美国,所以有时候请求会比较慢。ribbon的请求时间也要设置,因为feign用的是ribbon。这里贴的是application.yml文件中的一小段

2 编码
1、主类注解

@EnableFeignClients

@EnableCircuitBreaker

@EnableHystrix

这三个都要,hystrix主要作用是断路器,会进如fein的fallback中。 主类代码在上面已经贴出来了

2、编写feign接口,MFeignClient.class

name是指要请求的服务名称。这里请求的是服务提供者

fallback 是指请求失败,进入断路器的类,和使用ribbon是一样的。

configuration 是feign的一些配置,例如编码器等。

@FeignClient(name = "sc-provider",fallback = MFeignClientFallback.class, configuration = MFeignConfig.class)
public interface MFeignClient {
// 这是被请求微服务的地址,也就是provider的地址
@GetMapping(value = "/test/{msg}")
String sayHelloWorld(@PathVariable("msg") String msg);
@GetMapping(value = "/test/list")
List<Integer> list();
@GetMapping(value = "/test/list")
Integer[] array();
}
3 MFeignConfig.class feign的配置
这里配置了feign的打印日志等级

@Configuration
public class MFeignConfig {br/>@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
4 MFeignClientFallback.class ,断路器回调方法
断路器要实现上边定义的MFeignClient接口,请求失败,进入断路器时,会回调这里的方法。

@Component
public class MFeignClientFallback implements MFeignClient{br/>@Override
public String sayHelloWorld(String msg) {
return "fallback";br/>}
@Override
public List<Integer> list() {
return new ArrayList<>();br/>}
@Override
public Integer[] array() {
return new Integer[0];
}
}
5 在controller中使用feignbr/>@RestController
public class FeignController {br/>@Autowired
private MFeignClient feignClient;br/>@GetMapping("/feign/{wd}")
public Mono<String> sayHelloWorld(@PathVariable("wd") String parm) {
String result = feignClient.sayHelloWorld(parm);
return Mono.just(result);br/>}
@GetMapping("/feign/list")
public Flux<Integer> list() {
List<Integer> list = feignClient.list();
Flux<Integer> userFlux = Flux.fromIterable(list);
return userFlux;br/>}
@GetMapping("/feign/array")
public Flux<Integer> array() {
Integer[] arrays = feignClient.array();
Flux<Integer> userFlux = Flux.fromArray(arrays);
return userFlux;
}
}

9.png

五、用zuul做路由转发和负载均衡

这些微服务都是隐藏在后端的,用户是看不到,或者不是直接接触,可以用nginx或者zuul进行路由转发和负载均衡,zuul负载均衡默认用的是ribbon。

1.修改build.gradle文件
compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
compile('org.springframework.cloud:spring-cloud-starter-config')
compile('org.springframework.cloud:spring-cloud-starter-netflix-zuul')
compile('org.springframework.boot:spring-boot-starter-actuator')
2.修改bootstrap.yml
还是原来的配方,application.yml在git仓库

eureka:
client:
service-url:
defaultZone: http://root:booszy@localhost:8761/eureka/
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}
appname: sc-zuul
spring:
application:
name: sc-zuul
cloud:
config:
discovery:
enabled: true
service-id: sc-config-server
fail-fast: true
username: root
password: booszy
profile: csdn
3.启动类
@RefreshScope这个注解是当application.yml配置文件发生变化的时候,不需要手动的进行重启,调用localhost:8400/refresh,就会加载新的配置文件,当然正在访问的客户并不影响还是使用旧的配置文件,因为不是重启,后来的用户会使用新的配置文件。注意这块的刷新要用post请求。

@EnableDiscoveryClientbr/>@SpringBootApplication
@EnableZuulProxybr/>@RefreshScope
public class Sb2scZuulApplication {
public static void main(String[] args) {
SpringApplication.run(Sb2scZuulApplication.class, args);
}
}
启动springboot项目,访问eureka-server

10.png

这时候,我们就要通过zuul访问微服务了,而不是直接去访问微服务。

应该访问地址http://localhost:8400/sc-consumer/feign/list,这块你要换成你的zuul地址。

但是有些人就会说,这样以后用户请求会不会太长,比较反感,所以可以通过配置进行修改访问地址。

zuul:
routes:
springcloud-consumer-config: /consumer/
springcloud-provider-config: /provider/

在application.yml中加入这样一段配置,其实就是nginx中的反向代理,使用一下简短的可以代理这个微服务。这个时候我们就可以这样去访问了http://localhost:8400/consumer/feign/list,是不是简短了很多

11.png

六、用hystrix-turbine-dashboard 做集群监控

项目在生产环境中,每个服务的访问量都不通,有些服务的访问量比较大,有时候有些服务挂了,不能继续服务,需要重启的时候,我们并不知道,所以这时候就需要使用hystrix-turbine-dashboard做一个监控,监控所有的微服务,可以看到这个接口实时访问量,和健康状况。

新建一个springboot项目,老套路,加入如下依赖

1 添加依赖
compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
compile('org.springframework.boot:spring-boot-starter-actuator')
compile('org.springframework.cloud:spring-cloud-starter-netflix-hystrix')
compile('org.springframework.cloud:spring-cloud-starter-netflix-hystrix-dashboard')
compile('org.springframework.cloud:spring-cloud-starter-netflix-turbine')
2 修改application.yml配置文件
注意:是application.yml,这里不需要bootstrap.yml
server:
port: 8900
eureka:
client:
service-url:
defaultZone: http://root:booszy@localhost:8761/eureka/
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}
appname: sc-dashboard
turbine:
aggregator:
clusterConfig: default
appConfig: sc-consumer
clusterNameExpression: "'default'"
spring:
application:
name: sc-dashboard
#management:

endpoints:

web:

exposure:

include: '*'

appConfig 后面是要检测的注册在eureka上的服务名,必须要有

3 修改主类
@EnableTurbine ,@EnableHystrixDashboard 一个都不能少

@EnableDiscoveryClientbr/>@SpringBootApplication
@EnableTurbinebr/>@EnableHystrixDashboard
public class Sb2scDashboardApplication {
public static void main(String[] args) {
SpringApplication.run(Sb2scDashboardApplication.class, args);
}
}
4 访问测试
这块的端口是8900,访问地址http://localhost:8900/hystrix,看到的是下面的页面。

13.png

然后在那个网址的输入框里输网址http://localhost:8900/turbine.stream,点击monitor stream。刚打开的时候可能是空的,什么也没有,这并不表示你已经错了。这时候你访问消费者服务的接口,例如访问http://localhost:8400/consumer/feign/list,多访问几次,然后看控制台有没有出现一个监控面板,没有就等会刷新一次,如果一直不出现,应该是配置有问题。

12.png

七、使用sleuth+zipkin 实现链路追踪服务

在使用微服务的时候,我们发现,有时候排错不好排查,所以就给大家整个这个链路追踪,很方便知道是哪一个服务调用哪一个服务出现了问题。因为有些项目可能服务比较多。

1 添加依赖
新建一个springboot项目

虽然其他服务调用zipkin不是从eureka上动态过去服务地址,而是硬编码,但是这块还是考虑吧zipkin注册到eureka上。

compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
compile group: 'io.zipkin.java', name: 'zipkin-server', version: '2.9.3'
compile group: 'io.zipkin.java', name: 'zipkin-autoconfigure-ui', version: '2.9.3'
compile('org.springframework.boot:spring-boot-starter-actuator')
如果提示log4j有冲突,要排除依赖

configurations {
compile.exclude module: 'log4j'
compile.exclude module: 'slf4j-log4j12'
compile.exclude module: 'spring-boot-starter-logging'
}
2 修改application配置文件
server:
port: 9411
spring:
application:
name: sc-sc-zipkin
profiles:
active: csdn
eureka:
client:
service-url:
defaultZone: http://root:booszy@localhost:8761/eureka/
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}
appname: sc-zipkin
management:
metrics:
web:
server:
auto-time-requests: false
3 主类注解添加
@EnableZipkinServer 主要是这个注解

启动服务后访问http://localhost:9411,就可以打开zipkin的控制台页面,这时候应该是什么都没有

@EnableDiscoveryClientbr/>@SpringBootApplication
@EnableZipkinServer
public class Sb2scZipkinApplication {
public static void main(String[] args) {
SpringApplication.run(Sb2scZipkinApplication.class, args);
}
}
4 其他服务中调用
这里我们在消费者服务和提供者服务里都加入如下依赖

....
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-sleuth', version: '1.3.1.RELEASE'
compile group: 'org.springframework.cloud', name: 'spring-cloud-sleuth-zipkin', version: '1.3.1.RELEASE'
...
然后修改配置文件,bootstrap.yml、

这块zipkin的地址是硬编码的,目前还没发现怎么从服务注册中心eureka上动态获取,以后有解决方案,会更新帖子

sleuth这个是配置提取率,可以配置也可以不配置

spring:
zipkin:
base-url: http://localhost:9411
sleuth:
sampler:
percentage: 1.0
启动服务,然后访问消费者服务的接口,这时候访问zipkin的控制台http://localhost:9411

14.png

点击依赖分析,可以看到调用服务链,因为这块只涉及到两个服务,所以只有两个,在实际生产环境中,这块可能有很多,到时候看起来就特别直观了。

15.png

16.

1、具有1-5工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加群。

2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加群。

3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加群。

4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加群。

5.群号Java架构交流群 668041364

6.阿里Java高级大牛直播讲解知识点,分享知识,上面六大专题都是各位老师多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知! 。

转载于:https://blog.51cto.com/14233733/2406859

springboot2新版springcloud微服务,带你了解不一样的springboot2相关推荐

  1. 介绍6款热门的SpringCloud微服务开源项目,总有适合你的!

    今天介绍六款比较热门的SpringCloud微服务项目,感兴趣的可以clone下来研究一下,相信对你学习微服务架构很有帮助. 一.Cloud-Platform 介绍 Cloud-Platform是国内 ...

  2. 学习笔记:SpringCloud 微服务技术栈_实用篇①_基础知识

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 前言 学习视频链接 SpringCloud + RabbitMQ + Docker + Redis + 搜 ...

  3. Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲

    Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲 Java生鲜电商平台:   微服务是当前非常流行的技术框架,通过服务的小型化.原子化以及分布式架构的弹性伸缩和高可用性, ...

  4. SpringCloud微服务治理技术入门

    1.集群.分布式.微服务 首先先理解三个感念 什么是集群?: 同一个业务,部署在多个服务器上,目的是实现高可用,保证节点可用! 什么是分布式?: 一个业务分拆成多个子业务,部署在不同的服务器上,每个子 ...

  5. SpringCloud微服务技术实践与总结(基础篇)

    1.认识微服务 1.1.单体架构 单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署. 单体架构的优缺点如下: 优点: 架构简单.部署成本低 缺点: 耦合度高(维护困难.升级困难) 1.2 ...

  6. 2021/04/25 SpringBoot + SpringCloud微服务项⽬交付案例

    第1章 SpringBoot + SpringCloud微服务项⽬交付案例 1.1 微服务概念 传统的是用户通过终端链接到应用里 现在服务往越来越小的方向做,把每个服务做成一个独立的功能,每个服务完成 ...

  7. java springcloud微服务航班管理系统源码+课程报告

    下载地址:https://download.csdn.net/download/qq_31293575/10728702 项目介绍 java springcloud微服务航班管理系统源码+课程报告 主 ...

  8. 主流SpringCloud微服务架构,您可少走弯路

    背景 时间回到2017年底,那会儿SpringCloud正处于如火如荼的状态,加上与K8s的完美契合,整个互联网公司也想借着这波热度做一次真真正正转型,但真正能落地有经验的人少之甚少,大部分公司还是摸 ...

  9. SpringCloud 微服务(六)-服务异步通信

    看完了黑马程序员的免费课程,感觉受益匪浅,写个笔记,记录一下 课程地址:SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,史上最全面的springcloud微服务技术栈 ...

最新文章

  1. 面试又挂了,你理解了 Java 8 的 Consumer、Supplier、Predicate和Function吗?
  2. 一次解析系统_消防稳压泵的流量、压力、选型以及配套气压罐的重难点解析
  3. 文本分类入门(番外篇)特征选择与特征权重计算的区别
  4. Hibernate中保存与持久性以及saveOrUpdate之间的区别
  5. JAVA计时函数的库_JAVA开发常用类库UUID、Optional、ThreadLocal、TimerTask、Base64使用方法与实例详解...
  6. python添加环境变量_windows系统下python学习-1 (python环境变量配置)
  7. 有故事、有实践,谈一谈深度迁移学习方法的基本思路
  8. 培养杰出程序员的捷径
  9. 2020 cr节目源_2020/8月最新IPTV M3U8直播源分享
  10. php和plc哪个难,致PLC初学者的入门一课,七大误区如何解决?
  11. CFA一级考试题型是什么?好不好考?
  12. web移动端:流式布局
  13. 我的HTC G16 CHACHA A810e版手机如何解锁和一键root的
  14. 百度开放大数据平台接口,传统企业看到了新曙光。
  15. 功放DIY电路制作完成
  16. 阿里云制作加密情书送给女朋友
  17. 社会生活中的著名法则- -
  18. java对外接口安全问题_怎么保证对外暴露接口的安全性(调用频率限制)
  19. 如何将零碎信息结构化并做到有序安放,以实现知识积累?
  20. 给我来一段Python求素数

热门文章

  1. 凭啥Java运行环境称虚拟机 Python只能称解释器
  2. 几种filter的比较
  3. 日请求亿级的QQ会员AMS平台PHP7升级实践
  4. 2.0Tonmcat高级配置和jDK的安装配置
  5. 记录我学github的路程(二)
  6. java list三种遍历方法性能比較
  7. js便签笔记(9)——解读jquery源码时记录的一些知识点
  8. 自制MVC之工具类插件一
  9. [WinAPI] API 4 [注册][创建][消息][第一个框架类窗口]
  10. Spring中集成ActiveRecordPlugin数据操作插件