springcloud微服务实战:Eureka+Zuul+Ribbon+Hystrix+SpringConfig
本文内容纲要:
-springcloud微服务实战:Eureka+Zuul+Ribbon+Hystrix+SpringConfig
-一、搭建eureka-server服务springcloud-eureka-server
-二、搭建config-server服务springcloud-config-server
-三、搭建服务提供者服务springcloud-provider-config
-四、搭建消费者服务springcloud-consumer-config-swagger
-五、用zuul做路由转发和负载均衡
原文地址:http://blog.csdn.net/yp090416/article/details/78017552
springcloud微服务实战:Eureka+Zuul+Ribbon+Hystrix+SpringConfig
相信现在已经有很多小伙伴已经或者准备使用springcloud微服务了,接下来为大家搭建一个微服务框架,后期可以自己进行扩展。会提供一个小案例:服务提供者和服务消费者,消费者会调用提供者的服务,新建的项目都是用springboot,附源码下载。
coding仓库地址:coding地址csdn下载地址:csdn下载地址
如果有问题请在下边评论,或者200909980加群交流。
Eureka:服务发现
Hystrix:断路器
Zuul:智能路由
Ribbon:客户端负载均衡
Turbine:集群监控
Springcloud-config:远程获取配置文件
接下来,我们开始搭建项目,首先我们到spring为我们提供的一个网站快速搭建springboot项目,点击访问,我这里用的是gradle,如果各位客官喜欢用maven,好吧你可以到http://mvnrepository.com/查看对应的依赖,点我访问。
一、搭建eureka-server服务springcloud-eureka-server
eureka-server作为服务发现的核心,第一个搭建,后面的服务都要注册到eureka-server上,意思是告诉eureka-server自己的服务地址是啥。当然还可以用zookeeper或者springconsul。
- 1.修改build.gradle文件
如果是maven项目请对应的修改pom.xml
//加入阿里的私服仓库地址
maven{url"http://maven.aliyun.com/nexus/content/groups/public/"}
1
2
//加入依赖
compilegroup:'org.springframework.cloud',name:'spring-cloud-starter-eureka-server',version:'1.3.4.RELEASE'
//加入security,是因为访问eureka-server需要用户名和密码访问,为了安全
compilegroup:'org.springframework.boot',name:'spring-boot-starter-security',version:'1.5.6.RELEASE'
1
2
3
4
还有几点需要修改的,大家对应图片看看,就是springboot打包的时候会提示找不到主累。
-
2.修改application.yml,建议用yml。
server: port:8761 eureka: datacenter:trmap environment:product client: healthcheck: enabled:true service-url: defaultZone:http://root:booszy@localhost:8761/eureka register-with-eureka:false#关闭自己作为客户端注册 fetch-registry:false security: basic: enabled:true user: name:root#用户名和密码,等会访问的时候,会要求你登录,服务注册的时候也需要带着用户名和密码 password:booszy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
-
3.修改程序的主类,建议修改类名,要加如eureka的@EnableEurekaServer注解,然后运行main方法。
@SpringBootApplication @EnableEurekaServer publicclassEurekaServerApplication{
publicstaticvoidmain(String[]args){ SpringApplication.run(EurekaServerApplication.class,args); }
}
1 2 3 4 5 6 7 8 9
http://localhost:8761/这个是eureka-server的页面地址,到这里,说明eureka-server搭建好了,简单吧,这一步一定要成功,否则后面的就不能继续进行下去了,后边基本类似。
二、搭建config-server服务springcloud-config-server
springcloud-config-server是用来将远程git仓库的配置文件动态拉下来,这样配置文件就可以动态的维护了。
新建一个springboot项目,修改maven私服地址,并加入一下依赖。
-
1.修改build.gradle文件
compilegroup:'org.springframework.cloud',name:'spring-cloud-starter-eureka',version:'1.3.4.RELEASE' compilegroup:'org.springframework.cloud',name:'spring-cloud-config-server',version:'1.3.2.RELEASE' compilegroup:'org.springframework.boot',name:'spring-boot-actuator',version:'1.5.6.RELEASE' //连接config-server也需要用户名和密码 compilegroup:'org.springframework.boot',name:'spring-boot-starter-security',version:'1.5.6.RELEASE'
1 2 3 4 5
-
2.修改application.yml文件
server: port:8500 eureka: client: service-url: #注册服务到eureka上,记住这里要加上eureka-server的用户名和密码 defaultZone:http://root:booszy@localhost:8761/eureka instance: prefer-ip-address:true #可能比较长,复制的时候请写在一行 instance-id:${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}} appname:springcloud-config-server spring: application: name:springcloud-config-server cloud: config: server: git: #这是其他项目配置文件的git仓库地址 uri:https://git.coding.net/yirenyishi/springcloud-config-profile searchPaths:'{application}' security: basic: enabled:true user: #这是config-server的用户名和密码 name:root password:booszy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
-
3.修改启动类
修改启动类,要加入这三个注解,因为要注册到eureka-server上,所以需要@EnableEurekaClient这个注解
@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient
publicclassConfigServerApplication{
publicstaticvoidmain(String[]args){
SpringApplication.run(ConfigServerApplication.class,args);
}
}
1
2
3
4
5
6
7
8
9
10
然后运行启动springboot项目,等启动成功后访问eureka的页面,会发现springcloud-config-server已经注册到上面了,如果启动报错,请检查错误信息。
三、搭建服务提供者服务springcloud-provider-config
编写一个服务提供者,提供两个接口,即获取单个用户的信息和获取一个用户列表。用到了spring-data-jpa和spring-webmvc,当然你们公司用什么你还是继续用什么。
-
- 注意:这里除了application.xml,还需要一个bootstrap.yml*
-
- 修改build.gradle文件
compile('org.springframework.boot:spring-boot-starter-data-jpa') compile('org.springframework.boot:spring-boot-starter-web') compile("com.alibaba:druid-spring-boot-starter:1.1.2") compilegroup:'org.springframework.cloud',name:'spring-cloud-starter-eureka',version:'1.3.4.RELEASE' compilegroup:'org.springframework.boot',name:'spring-boot-actuator',version:'1.5.6.RELEASE' compilegroup:'org.springframework.cloud',name:'spring-cloud-starter-config',version:'1.3.2.RELEASE' compilegroup:'org.springframework.session',name:'spring-session-data-redis',version:'1.3.1.RELEASE' runtime('mysql:mysql-connector-java')
1 2 3 4 5 6 7 8
-
2.编写配置文件bootstrap.yml
*注意:这里除了application.xml,还需要一个bootstrap.yml
application.xml我是放到远程仓库地址的,大家可以直接到我的远程仓库,根据项目名(springcloud-provider-config)查询。配置文件的仓库地址:点击访问。
spring:
application:
name:springcloud-provider-config
cloud:
config:
#config-server的配置,不需要硬编码config-server的地址,使用service-id去eureka-server获取cong-server的地址
discovery:
enabled:true
service-id:springcloud-config-server
fail-fast:true
username:root
password:booszy
profile:dev
eureka:
client:
service-url:
defaultZone:http://root:booszy@localhost:8761/eureka
instance:
prefer-ip-address:true
instance-id:${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}
appname:springcloud-provider-config
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- 3.编写代码
编写主类
@SpringBootApplication
@EnableEurekaClient
publicclassProviderApplication{
publicstaticvoidmain(String[]args){
SpringApplication.run(ProviderApplication.class,args);
}
}
1
2
3
4
5
6
7
8
新建UserController,考虑篇幅UserService和UserRepository就不贴代码了,想看的可以下载我的代码。
@RequestMapping("user")
@RestController
publicclassUserController{
@Autowired
privateUserServiceuserService;
/**
*@paramid
*@return
*/
@GetMapping("{id}")
publicUsergetuser(@PathVariableStringid){
Useruser=null;
try{
System.out.println(id);
user=userService.find(id);
}catch(Exceptione){
e.printStackTrace();
}
returnuser;
}
/**
*@return
*/
@GetMapping("list")
publicList<User>users(){
try{
List<User>user=userService.findAll();
if(user!=null&&user.size()!=0){
returnuser;
}
returnnull;
}catch(Exceptione){
e.printStackTrace();
}
returnnull;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
运行springboot项目,去eureka-server查看,有没有注册上。
我们的springcloud-provider-config已经注册到eureka上了,访问接口,成功。
四、搭建消费者服务springcloud-consumer-config-swagger
消费者要访问服务提供者的服务,这里用的是通过RestTemplate请求resetful接口,使用ribbon做客户端负载均衡,hystrix做错误处理,swagger生成接口文档。
还是熟悉的配方,熟悉的味道,新建springboot项目,添加项目依赖。
-
1.修改build.gradle文件
compile('org.springframework.boot:spring-boot-starter-web') compilegroup:'org.springframework.cloud',name:'spring-cloud-starter-eureka',version:'1.3.4.RELEASE' compilegroup:'org.springframework.boot',name:'spring-boot-actuator',version:'1.5.6.RELEASE' compilegroup:'org.springframework.cloud',name:'spring-cloud-starter-config',version:'1.3.2.RELEASE' compilegroup:'org.springframework.cloud',name:'spring-cloud-starter-hystrix',version:'1.3.4.RELEASE' compile( "io.springfox:springfox-swagger2:2.7.0", "io.springfox:springfox-swagger-ui:2.7.0" )
1 2 3 4 5 6 7 8 9
-
2.修改bootstrap.yml文件
application.yml在git仓库,请前往git仓库查看。
spring:
application:
name:springcloud-consumer-config
cloud:
config:
discovery:
enabled:true
service-id:springcloud-config-server
fail-fast:true
username:root
password:booszy
profile:dev
eureka:
client:
service-url:
defaultZone:http://root:booszy@localhost:8761/eureka
instance:
prefer-ip-address:true
instance-id:${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}
appname:springcloud-consumer-config
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
- 3.编写代码
启动类代码
@RibbonClient指定服务使用的负载均衡类型,name不指定服务则为所有的服务打开负载均衡,也可以在用yml中进行配置。
@EnableHystrix是支持hystrix打开断路器,在规定时间内失败参数超过一定参数,就会打开断路器,不会发起请求,而是直接进入到错误处理方法。
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name="springcloud-provider-config",configuration=RibbonConfiguration.class)
@ComponentScan(excludeFilters={@ComponentScan.Filter(type=FilterType.ANNOTATION,value=ExtendRibbon.class)})
@EnableHystrix
publicclassConsumerApplication{
@Autowired
privateRestTemplateBuilderbuilder;
@Bean
@LoadBalanced
publicRestTemplaterestTemplate(){
returnbuilder.build();
}
publicstaticvoidmain(String[]args){
SpringApplication.run(ConsumerApplication.class,args);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
新建UserController
ribbon一个坑,不能接受List类型,要使用数组接收。
@Apixxx是swagger的注解
@HystrixCommand(fallbackMethod=”userFallbackMethod”)
如果请求失败,会进入userFallbackMethod这个方法,userFallbackMethod这个方法要求参数和返回值与回调他的方法保持一致。
ribbon这个方法就是通过service-id获取获取服务实际的地址,这样服务的地址就不用硬编码了。
@Api("springcloudconsumeruser控制器")
@RequestMapping("user")
@RestController
publicclassUserController{
@Autowired
privateRestTemplaterestTemplate;
@Autowired
privateLoadBalancerClientloadBalancerClient;
/**
*@paramid
*@return
*/
@ApiOperation(value="根据用户id查询用户信息",httpMethod="GET",produces="application/json")
@ApiResponse(code=200,message="success",response=User.class)
@GetMapping("{id}")
@HystrixCommand(fallbackMethod="userFallbackMethod")
publicUsergetUser(@ApiParam(name="id",required=true,value="用户Id")@PathVariableStringid){
returnthis.restTemplate.getForObject("http://springcloud-provider-config/user/"+id,User.class);
}
publicUseruserFallbackMethod(Stringid){
returnnull;
}
/**
*这块ribbon不支持复杂数据类型list,所以要用数组接受,然后转list
*@return
*/
@GetMapping("list")
@HystrixCommand(fallbackMethod="userList")
publicList<User>users(HttpServletRequestrequest){
try{
User[]forObject=this.restTemplate.getForObject("http://springcloud-provider-config/user/list",User[].class);
List<User>users=Arrays.asList(forObject);
returnusers==null?newArrayList<User>():users;
}catch(Exceptione){
e.printStackTrace();
}
returnnull;
}
publicList<User>userList(HttpServletRequestrequest){
returnnull;
}
/**
*通过服务id获取服务的地址
*@return
*/
@GetMapping("ribbon")
publicStringribbon(){
ServiceInstanceserviceInstance=loadBalancerClient.choose("springcloud-provider-config");
returnserviceInstance.getUri().toString();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
运行springboot项目,先看有没有注册到eureka-server上。
注册成功后,访问接口,测试是否正确。
测试swagger-ui,访问localhost:8200/swagger-ui.html
到这里消费者服务就算是完成了,后边大家自己进行扩展。
五、用zuul做路由转发和负载均衡
这些微服务都是隐藏在后端的,用户是看不到,或者不是直接接触,可以用nginx或者zuul进行路由转发和负载均衡,zuul负载均衡默认用的是ribbon。
-
1.修改build.gradle文件
compilegroup:'org.springframework.cloud',name:'spring-cloud-starter-eureka',version:'1.3.4.RELEASE' compilegroup:'org.springframework.cloud',name:'spring-cloud-starter-zuul',version:'1.3.4.RELEASE' compilegroup:'org.springframework.boot',name:'spring-boot-actuator',version:'1.5.6.RELEASE' compilegroup:'org.springframework.cloud',name:'spring-cloud-starter-config',version:'1.3.2.RELEASE'
1 2 3 4
-
2.修改bootstrap.yml
还是原来的配方,application.yml在git仓库
spring:
application:
name:springcloud-zuul
cloud:
config:
discovery:
enabled:true
service-id:springcloud-config-server
fail-fast:true
username:root
password:booszy
profile:dev
eureka:
client:
service-url:
defaultZone:http://root:booszy@localhost:8761/eureka
instance:
prefer-ip-address:true
instance-id:${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}
appname:springcloud-zuul
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
- 3.启动类
@RefreshScope这个注解是当application.yml配置文件发生变化的时候,不需要手动的进行重启,调用localhost:8400/refresh,就会加载新的配置文件,当然正在访问的客户并不影响还是使用旧的配置文件,因为不是重启,后来的用户会使用新的配置文件。注意这块的刷新要用post请求。
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
@RefreshScope
publicclassZuulApplication{
publicstaticvoidmain(String[]args){
SpringApplication.run(ZuulApplication.class,args);
}
}
1
2
3
4
5
6
7
8
9
10
启动springboot项目,访问eureka-server
这时候,我们就要通过zuul访问微服务了,而不是直接去访问微服务。
应该访问地址http://192.168.89.89:8400/springcloud-consumer-config/user/list,这块你要换成你的zuul地址。
但是有些人就会说,这样以后用户请求会不会太长,比较反感,所以可以通过配置进行修改访问地址。
zuul:
routes:
springcloud-consumer-config:/consumer/**
springcloud-provider-config:/provider/**
1
2
3
4
在application.yml中加入这样一段配置,其实就是nginx中的反向代理,使用一下简短的可以代理这个微服务。这个时候我们就可以这样去访问了http://192.168.89.89:8400/consumer/user/list,是不是简短了很多
本文内容总结:springcloud微服务实战:Eureka+Zuul+Ribbon+Hystrix+SpringConfig,一、搭建eureka-server服务springcloud-eureka-server,二、搭建config-server服务springcloud-config-server,三、搭建服务提供者服务springcloud-provider-config,四、搭建消费者服务springcloud-consumer-config-swagger,五、用zuul做路由转发和负载均衡,
原文链接:https://www.cnblogs.com/wlzjdm/p/7811536.html