Spring Cloud教程之SpringCloud Rest+Ribbon
Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于 Netflix Ribbon 实现。 通过 Spring Cloud 的封装, 可以让我们轻松地将面向服务的 REST 模板请求自动转换成客户端负载均衡的服务调用。 Spring Cloud Ribbon 虽然只是一个工具类框架,它不像服务注册中心、 配置中心、 API 网关那样需要独立部署, 但是它几乎存在于每一个Spring Cloud 构建的微服务和基础设施中。 因为微服务间的调用,API 网关的请求转发等内容实际上都是通过伈bbon 来实现的。
3.2 搭建SpringCloudRibbon
3.2.1 启动eureka-service和 service-hi 这里注意,service-hi可以多端口启动,来实现多服务注册
具体步骤如下
至此,我们可以通过修改server-hi的端口号来模拟多个服务
可以看到server-hi 的地址有两个,8763和8762。
3.2.2 创建Ribbon-service模块
步骤略,创建完毕的pom.xml包含如下
3.2.3 配置application.yml
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/ #服务注册中心的地址
server:
port: 8764 #端口号
spring:
application:
name: service-ribbon #服务名
3.2.4 创建restful
@SpringBootApplication @EnableEurekaClient @EnableDiscoveryClient public class ServiceRibbonApplication { public static void main(String[] args) { SpringApplication.run(ServiceRibbonApplication.class, args); } @Bean @LoadBalanced RestTemplate restTemplate(){ return new RestTemplate(); } }
其中
@EnableDiscoveryClient表明向服务中心注册服务;
@Bean 表明向程序中注入一个restTemplate;
@LoadBalanced:开启负载均衡
@Service public class HelloService { @Autowired RestTemplate restTemplate; public String hiService(String name){ return restTemplate.getForObject("http://service-hi/hi?name="+name,String.class); } }
创建Service, 注入restTemplate来消费SERVICE-HI服务的hi接口;
http://service-hi?name ==》 service-hi就是我们的服务提供方的application-name,在ribbon中,它会根据服务名来选择具体的服务实例,根据服务实例在请求的时候会用具体的url替换掉服务名
@RestController public class HelloController { @Autowired HelloService helloService; @GetMapping(value = "/hi") public String hi(@RequestParam String name){ return helloService.hiService(name); } }
3.2.5 启动并调用服务
服务调用成功!
此时系统构架如下
EureKa-server作为服务注册中心,端口号为8761
service-hi提供了两个实例, 一个是端口号8762、另一个为8763,并向服务注册中心注册
service-ribbon 端口号为8764,向服务中心注册
service-ribbon通过restTemplate的方式调用service-hi的hi接口,rebbon进行了负载均衡,故会轮流请求8762、8763端口