云社区 博客 博客详情

我的SpringCloud(七):Feign声明式接口调用

Mocca 发表于 2020-04-01 21:23:26 2020-04-01
0
0

【摘要】 一、什么是Feign  Feign也是去实现负载均衡,但是它的使用要比Ribbon更加简化,它实际上是基于Ribbon进行了封装,让我们可以通过调用接口的方式实现负载均衡。Feign和Ribbon都是由Netflix提供的,Feign是一个声明式、模板化的WebService客户端,它简化了开发者编写Web服务客户端的操作,开发者可以通过简单的接口和注解来调用HTTPAPI,使...

一、什么是Feign

    Feign也是去实现负载均衡,但是它的使用要比Ribbon更加简化,它实际上是基于Ribbon进行了封装,让我们可以通过调用接口的方式实现负载均衡。Feign和Ribbon都是由Netflix提供的,Feign是一个声明式、模板化的Web Service客户端,它简化了开发者编写Web服务客户端的操作,开发者可以通过简单的接口和注解来调用HTTP API,使得开发变得更加简化、快捷。Spring Cloud Feign也是基于Netflix Feign的二次开发,它整合了Ribbon和Hystrix,具有可插拔、基于注解、负载均衡、服务熔断等一系列的便捷功能,也就是说我们在实际开发中可以用Feign来取代Ribbon。

    相比较于Ribbon+RestTemplate的方式,Feign大大简化了代码的开发,Feign支持多种注解,包括Feign注解、JAX-RS注解、Spring MVC注解等,Spring Cloud对Feign进行了油画,整合了Ribbon和Eureka,从而让Feign使用更加方便。

二、Ribbon和Feign的区别

    Ribbon是一个通用的HTTP客户端工具,Feign是基于Ribbon实现的。

三、Feign的优点

    1.Feign是一个声明式的Web Service客户端。

    2.支持Feign注解、Spring MVC注解、JAX-RS注解

    3.Feign是基于Ribbon实现,使用起来更加方便

    4.Feign集成了Hystrix,具备服务熔断的功能

四、实战!

    1.创建Module,配置pom.xml如下:

    
    	org.springframework.cloud
    	spring-cloud-starter-netflix-eureka-client
    	2.0.2.RELEASE
    
    
    
    	org.springframework.cloud
    	spring-cloud-starter-openfeign
    	2.0.2.RELEASE
    

    2.创建配置文件application.yml,配置如下:

server:
  port: 8050
spring:
  application:
    name: feign
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
  instance:
    prefer-ip-address: true

    3.创建启动类,代码如下:

package com.zing;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients
public class FeignApplication {
	public static void main(String[] args) throws Exception {
		SpringApplication.run(FeignApplication.class, args);
	}

}

    注解说明:

        * @EnableFeignClients:声明其为Feign客户端

    4.创建声明式接口,代码如下:

package com.zing.feign;

import java.util.Collection;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

import com.zing.entity.Student;

@FeignClient(value = "provider")
public interface IFeignService {
	
	@GetMapping("/student/findAll")
	public Collection findAll();
	
	@GetMapping("/student/index")
	public String index();
}

    5.Handler代码如下:

package com.zing.controller;

import java.util.Collection;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.zing.entity.Student;
import com.zing.feign.IFeignService;

@RestController
@RequestMapping("/feign")
public class FeignHandler {

	@Autowired
	private IFeignService feignservice;
	
	@GetMapping("/findAll")
	public Collection findAll(){
		return feignservice.findAll();
	}
	
	@GetMapping("/index")
	public String index() {
		return feignservice.index();
	}
	
}

    6.测试feign的负载均衡功能

        (1)分别启动注册中心,两个不同端口的服务提供者,feign,注册中心页面如下:

        (2)多次访问 http://localhost:8050/feign/index ,我们可以看到两个端口地址交替出现,证明Feign实现了负载均衡。如下图:

    7.测试Feign的熔断机制

        (1)我们先停掉所有的服务提供者,只保留注册中心和Feign的服务,打开注册中心如下图:

        (2)再次访问 http://localhost:8050/feign/index 可看到如下图的内容:

        (3)为了不直接暴露错误信息,我们需要添加服务熔断机制,修改application.yml如下:

server:
  port: 8050
spring:
  application:
    name: feign
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
  instance:
    prefer-ip-address: true
feign:
  hystrix:
    enabled: true

        配置说明:

            * feign.hystrix.enable:是否开启熔断机制,默认false。

        (4)创建IFeignService的实现类FeignServiceImpl,在里面定义容错处理机制,通过@Component注解将FeignServiceImpl实例注入到IOC容器中,代码如下:

package com.zing.feign.impl;

import java.util.Collection;

import org.springframework.stereotype.Component;

import com.zing.entity.Student;
import com.zing.feign.IFeignService;

@Component
public class FeignServiceImpl implements IFeignService{

	@Override
	public Collection findAll() {
		return null;
	}

	@Override
	public String index() {
		return "服务器维护中。。。";
	}

}

        (5)在IFeignService接口定义处定义@FeignClient的fallback属性来做降级处理,设置映射,映射到FeignServiceImpl中去。修改IFeignService后代码如下:

package com.zing.feign;

import java.util.Collection;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

import com.zing.entity.Student;
import com.zing.feign.impl.FeignServiceImpl;

@FeignClient(value = "provider",fallback = FeignServiceImpl.class)
public interface IFeignService {
	
	@GetMapping("/student/findAll")
	public Collection findAll();
	
	@GetMapping("/student/index")
	public String index();
}

        (6)重复(1)、(2)步,出现以下界面,证明服务熔断机制起效。如图:

五、总结

    我们在本次的代码中,采用Feign实现了负载均衡和服务熔断。了解了Feign的配置以及使用的基本原理,那么我们再来仔细学习下Hystix容错机制。让我们期待下一课《我的Spring Cloud(八):Hystix 容错机制》

文章来源: www.oschina.net,作者:Zing丶,版权归原作者所有,如需转载,请联系作者。

原文链接:https://my.oschina.net/qq785482254/blog/3216671

登录后可下载附件,请登录或者注册

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:huaweicloud.bbs@huawei.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
评论文章 //点赞 收藏 0
点赞
分享文章到微博
分享文章到朋友圈

上一篇:ASP.NET Core AutoWrapper 自定义响应输出

下一篇:如何解决Mac系统的Safari浏览器限制第三方Cookie

评论 (0)


登录后可评论,请 登录注册

评论