一、Ribbon 简介
ribbon是一个负载均衡客户端,可以很好的控制http和tcp的一些行为。Feign默认集成了ribbon。
二、准备工作
启动 Eureka server。
三、创建 Ribbon服务
重新新建一个spring-boot工程,取名为:service-ribbon; 在它的pom.xml继承了父pom文件,并引入了以下依赖:
image.png
image.png image.png
在工程的配置文件指定服务的注册中心地址为http://localhost:xxxx/eureka/,程序名称为 service-ribbon,程序端口为8772。配置文件application.yml如下:
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:xxxx/eureka/
server:
port: 8772
spring:
application:
name: service-ribbon
在工程的启动类中,通过@EnableDiscoveryClient向服务中心注册;并且向程序的ioc注入一个bean: restTemplate;并通过@LoadBalanced注解表明这个restRemplate开启负载均衡的功能。
@SpringBootApplication
public class ServiceRibbonApplication {
public static void main(String[] args) {
SpringApplication.run( ServiceRibbonApplication.class, args );
}
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
}
写一个测试类HelloService,通过之前注入ioc容器的restTemplate来消费service-hi服务的“/hi”接口,在这里我们直接用的程序名替代了具体的url地址,在ribbon中它会根据服务名来选择具体的服务实例,根据服务实例在请求的时候会用具体的url替换掉服务名,代码如下:
package com.mengmaedu.serviceribbon.test;
import com.netflix.discovery.converters.Auto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @Auther: Tangzhiqiang
* @Date: 2018/11/26 17:09
* @Description: 使用 ribbon调用 eureka client 接口(消费 eureka client)
*/
@RestController
public class TestEurekaClient {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/ribbon_test")
public String test() {
return restTemplate.getForObject("http://EUREKA-CLINET/test", String.class);
}
}
在浏览器上多次访问http://127.0.0.1:8772/ribbon_test,浏览器交替显示:
"测试 ribbon 使用"
这说明当我们通过调用restTemplate.getForObject(....)方法时,已经做了负载均衡,访问了不同的端口的服务实例。
四、Feign简介
Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔的注解特性,可使用feign注解。feign支持可插拔的编码器和解码器。feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果。
简而言之:
- feign采用的是基于接口的注解
- feign整合了ribbon,具有负载均衡的能力
- 整合了Hystrix,具有熔断的能力
创建 feign服务
新建一个spring-boot工程,取名为service-feign,在它的 pom.xml 文件引入Feign的起步依赖spring-cloud-starter-feign、Eureka的起步依赖spring-cloud-starter-netflix-eureka-client、Web的起步依赖spring-boot-starter-web,如下:
image.png image.png image.png
在工程的配置文件application.yml文件,指定程序名为service-feign,端口号为8775,服务注册地址为http://localhost:8762/eureka/ ,代码如下:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8762/eureka/
server:
port: 8775
spring:
application:
name: service-feign
在程序的启动类ServiceFeignApplication ,加上@EnableFeignClients注解开启Feign的功能:
@SpringBootApplication
@EnableFeignClients
public class ServiceFeignApplication {
public static void main(String[] args) {
SpringApplication.run( ServiceFeignApplication.class, args );
}
}
定义一个feign接口,通过@ FeignClient(“服务名”),来指定调用哪个服务。比如在代码中调用了EUREKA-CLIENT 服务的“/test”接口,代码如下:
@FeignClient(value = "EUREKA-CLIENT")
public interface SchedualServiceHi {
@RequestMapping(value = "/test",method = RequestMethod.GET)
String sayHiFromClientOne();
}
在Web层的controller层,对外暴露一个”/test”的API接口,通过上面定义的Feign客户端SchedualServiceHi 来消费服务。代码如下:
@RestController
public class HiController {
@Autowired
SchedualServiceHi schedualServiceHi;
@GetMapping(value = "/test")
public String sayHi() {
return schedualServiceHi.sayHiFromClientOne();
}
}
启动程序,访问http://localhost:8775/test
浏览器显示
测试 ribbon 使用
网友评论