SpringCloud2.0 Ribbon和Feign 介绍和使用

1.Ribbon 和 Feign 简介

1.1 Ribbon

RibbonNetflix 发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon 客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出 Load Balancer 后面所有的机器,Ribbon 会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。简单地说,Ribbon 是一个客户端负载均衡器。

Ribbon 工作时分为两步:第一步先选择 Eureka Server, 它优先选择在同一个Zone且负载较少的Server;第二步再根据用户指定的策略,在从Server 取到的服务注册列表中选择一个地址。其中Ribbon提供了多种策略,例如轮询、随机、根据响应时间加权等。

Feign

Feign 是一个声明式的 web service 客户端,它使得编写 web service 客户端更为容易。创建接口,为接口添加注解,即可使用FeignFeign可以使用Feign注解或者JAX-RS注解,还支持热插拔的编码器和解码器。Spring CloudFeign添加了Spring MVC的注解支持,并整合了RibbonEureka来为使用 Feign 时提供负载均衡。

2.配置步骤

2.1 服务端pom依赖

<dependencies>
		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-starter-webartifactId>
		dependency>
		<dependency>
			<groupId>org.springframework.cloudgroupId>
			<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
		dependency>
		<dependency>
			<groupId>org.springframework.cloudgroupId>
			<artifactId>spring-cloud-starter-netflix-ribbonartifactId>
		dependency>
		<dependency>
			<groupId>org.springframework.cloudgroupId>
			<artifactId>spring-cloud-starter-zipkinartifactId>
		dependency>
		<dependency>
			<groupId>org.springframework.cloudgroupId>
			<artifactId>spring-cloud-stream-binder-rabbitartifactId>
		dependency>
		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-testartifactId>
		dependency>
	dependencies>
2.1.1 启动类
@SpringBootApplication
@EnableDiscoveryClient
public class ProducerApplication {
	public static void main(String[] args) {
		SpringApplication.run(ProducerApplication.class, args);
	}
}
2.1.2 服务接口

@RestController
public class UserController {
    /**
     * 获取人员
     * @param id
     * @return
     */
    @GetMapping("/getUsesById/{id}")
    public UserVO getUsesById(@PathVariable String id) {
        return new UserVO().setId(id).setAge(18).setName("这是一个18岁的小男孩");
    }
}
2.1.3 配置文件
spring.application.name=spring-cloud-producer
server.port=9000
eureka.client.serviceUrl.defaultZone=http://eureka-peer1:8100/eureka/,http://eureka-peer2:8200/eureka/,http://eureka-peer3:8300/eureka/
spring.freemarker.prefer-file-system-access=false

之后启动启动类,访问http://127.0.0.1:9100/getUsesById/1 查看效果
SpringCloud2.0 Ribbon和Feign 介绍和使用_第1张图片
然后查看注册中心:
SpringCloud2.0 Ribbon和Feign 介绍和使用_第2张图片
目前服务已经启动成功!

2.2 消费端配置

2.2.1 服务端pom依赖

<dependencies>
		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-starter-webartifactId>
		dependency>
		<dependency>
			<groupId>org.springframework.cloudgroupId>
			<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
		dependency>
		<dependency>
			<groupId>org.springframework.cloudgroupId>
			<artifactId>spring-cloud-starter-netflix-ribbonartifactId>
		dependency>
		<dependency>
			<groupId>org.springframework.cloudgroupId>
			<artifactId>spring-cloud-starter-zipkinartifactId>
		dependency>
		<dependency>
			<groupId>org.springframework.cloudgroupId>
			<artifactId>spring-cloud-stream-binder-rabbitartifactId>
		dependency>

		<dependency>
			<groupId>org.springframework.cloudgroupId>
			<artifactId>spring-cloud-starter-openfeignartifactId>
		dependency>
	dependencies>
2.2.1 启动类
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {
	public static void main(String[] args) {
		SpringApplication.run(ConsumerApplication.class, args);
	}
}

2.2.2 配置文件

spring.application.name=spring-cloud-consumer
server.port=9001
eureka.client.serviceUrl.defaultZone=http://eureka-peer1:8100/eureka/,http://eureka-peer2:8200/eureka/,http://eureka-peer3:8300/eureka/

2.2.3 Feign 和Ribbon 远程调用服务

/**
 * @author wwupower
 * @Title: 远程调用
 * @history 2019年07月06日
 * @since JDK1.8
 */
@FeignClient("spring-cloud-producer")
public interface UserSeriveClient {

    /**
     *
     * @param id
     * @return
     */
    @RequestMapping(value = "/getUserById/{id}",method= RequestMethod.GET)
    UserVO getUserById(@PathVariable("id") String id);

}

2.2.4 访问Controller



/**
 * FeignClient
 */
@RestController
public class ConsumerController {

    @Autowired
    com.power.service.HelloService HelloRemote;

    @Autowired
    UserSeriveClient userSeriveClient;
	
    @RequestMapping("/hello/{name}")
    public String index(@PathVariable("name") String name) {
        return HelloRemote.hello(name);
    }

    @RequestMapping("/getUserById/{id}")
    public UserVO getUserById(@PathVariable("id") String id) {
        return userSeriveClient.getUserById(id);
    }

}

访问地址 http://127.0.0.1:9001/getUserById/1 返回成功数据成功!
SpringCloud2.0 Ribbon和Feign 介绍和使用_第3张图片
下面介绍 Ribbon 使用demo


/**
 * FeignClient
 */
@RestController
public class RestTemplateController {

    @Bean
    // 使用轮询的方式调用服务
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @RequestMapping(value = "/hello2/{name}", method = RequestMethod.GET)
    public String service1(@PathVariable("name") String name) {
        return restTemplate().getForObject("http://localhost:9000/hello?name="+name, String.class);
    }

    @RequestMapping("/getUserById2/{id}")
    public UserVO getUserById2(@PathVariable("id") String id) {
        return restTemplate().getForObject("http://localhost:9000/getUserById/"+id, UserVO.class);
    }



}

参加资料:
深入理解 Ribbon-Hystrix-Feign 三者之间的关系(一)

你可能感兴趣的:(spring,cloud)