上两章我们讲解了spring-cloud的服务注册发现以及动态刷新配置,这一章我们主要讲解服务的调用。
既然是分布式项目,那么服务之间该采用什么方式去互相调用呢。之前我们使用最多的是Dubbo作为服务间的调用,而Dubbo则是采用的RPC(远程调用服务)来实现的,Spring-cloud 提供两辆种服务调度方式:Ribbon+restful和Feign。Ribbon就是一个基于客户端的负载均衡器, Ribbon提供了很多在HTTP和TCP客户端之上的控制.
Feign内部也已经使用了Ribbon, 所以只要使用了@FeignClient注解,那么这一章的内容也都是适用的。
下面就看看如何Spring Cloud如何用Ribbon来实现两个Hello World服务的负载均衡。以下是Spring cloud的ribbon客户端负载均衡架构图。
1)首先我们在之前的项目基础上再建一个Ribbon服务,pom文件及项目结构如下
pom.xml
4.0.0
com.example
ribbon
0.0.1-SNAPSHOT
jar
ribbon
Demo project for Spring Boot
com.example
spring-cloud
0.0.1-SNAPSHOT
UTF-8
UTF-8
1.8
Finchley.RELEASE
org.springframework.cloud
spring-cloud-starter-netflix-ribbon
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
spring-milestones
Spring Milestones
https://repo.spring.io/milestone
false
2)配置Ribbon的application.yml文件并在启动类加上@EnableEurekaClient和@EnableDiscoveryClient向服务中心注册
3)配置一个ResTemplate的Bean,然后编写测试类注入这个Bean,使用RestTemplate的getForObject方法调用eureka-client的方法
此时启动Ribbon项目并访问localhost:8764/ribbon/test看是否输出正确的值即表示成功
4)上面我们介绍了Ribbon如何调用服务,现在我们则使用Feign来进行服务间的调用。
首先我们还是新建一个Feign的项目,pom文件和项目结构如下
4.0.0
com.example
feign
0.0.1-SNAPSHOT
jar
feign
Demo project for Spring Boot
com.example
spring-cloud
0.0.1-SNAPSHOT
UTF-8
UTF-8
1.8
Finchley.RELEASE
org.springframework.cloud
spring-cloud-starter-openfeign
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
spring-milestones
Spring Milestones
https://repo.spring.io/milestone
false
5)我们还是需要配置Feign的applicatio.yml文件,然后在启动类加上@EnableEurekaClient和@EnableFeignClients以及@EnableDiscoveryClient开启服务发现和向服务中心注册
6)接下来我们创建一个Feign的测试接口,并在Web层创建一个Controller来进行调用
注意这里在调用服务一方的启动类上需要加上如下注解@EnableFeignClients表示发现服务,并配置服务接口所在的包
7)此时启动项目访问localhost:8764/ribbon/feignTest,如果不报错即表示成功
在这里使用Feign会有很多坑,比如我就陷在了命名上面,当时我创建的接口名为feignService,结果一直报如下错误,具体是不是因为命名的问题还有待确定........
由于我也是刚接触spring-cloud,所以文章会有很多不足的地方,如果大家发现有问题欢迎评论,持续改进ing