暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

声明式调用---Feign

dalaoyang 2018-05-06
563

Feign:Feign是一种声明式、模板化的HTTP客户端。

用我的理解来说,Feign的功能类似dubbo暴露服务,但是与dubbo稍有不同的是Feign是HTTP REST接口的形式暴露的。

这一篇还是要利用到上一篇中的service(8762),service(8763)两个服务,先启动这两个服务。

新建项目,service-feign(8765),pom加入feign依赖,完整pom代码如下:

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  3.         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  4.    <modelVersion>4.0.0</modelVersion>


  5.    <groupId>com.dalaoyang</groupId>

  6.    <artifactId>springcloud_feign</artifactId>

  7.    <version>0.0.1-SNAPSHOT</version>

  8.    <packaging>jar</packaging>


  9.    <name>springcloud_feign</name>

  10.    <description>springcloud_feign</description>


  11.    <parent>

  12.        <groupId>org.springframework.boot</groupId>

  13.        <artifactId>spring-boot-starter-parent</artifactId>

  14.        <version>1.5.9.RELEASE</version>

  15.        <relativePath/> <!-- lookup parent from repository -->

  16.    </parent>


  17.    <properties>

  18.        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

  19.        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

  20.        <java.version>1.8</java.version>

  21.        <spring-cloud.version>Edgware.SR1</spring-cloud.version>

  22.    </properties>


  23.    <dependencies>

  24.        <dependency>

  25.            <groupId>org.springframework.cloud</groupId>

  26.            <artifactId>spring-cloud-starter-eureka</artifactId>

  27.        </dependency>


  28.        <dependency>

  29.            <groupId>org.springframework.boot</groupId>

  30.            <artifactId>spring-boot-starter-test</artifactId>

  31.            <scope>test</scope>

  32.        </dependency>


  33.        <dependency>

  34.            <groupId>org.springframework.cloud</groupId>

  35.            <artifactId>spring-cloud-starter-feign</artifactId>

  36.        </dependency>

  37.    </dependencies>


  38.    <dependencyManagement>

  39.        <dependencies>

  40.            <dependency>

  41.                <groupId>org.springframework.cloud</groupId>

  42.                <artifactId>spring-cloud-dependencies</artifactId>

  43.                <version>${spring-cloud.version}</version>

  44.                <type>pom</type>

  45.                <scope>import</scope>

  46.            </dependency>

  47.        </dependencies>

  48.    </dependencyManagement>


  49.    <build>

  50.        <plugins>

  51.            <plugin>

  52.                <groupId>org.springframework.boot</groupId>

  53.                <artifactId>spring-boot-maven-plugin</artifactId>

  54.            </plugin>

  55.        </plugins>

  56.    </build>



  57. </project>

复制

在启动类加入@EnableFeignClients注解,如果没有加入basePackages制定扫描包得话,默认会去找项目会扫描到的所有@FeignClient。启动类代码如下:

  1. package com.dalaoyang;


  2. import org.springframework.boot.SpringApplication;

  3. import org.springframework.boot.autoconfigure.SpringBootApplication;

  4. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

  5. import org.springframework.cloud.netflix.feign.EnableFeignClients;



  6. @SpringBootApplication

  7. @EnableEurekaClient

  8. //@EnableFeignClients(basePackages = "com.dalaoyang.interfaces")

  9. @EnableFeignClients

  10. public class SpringcloudFeignApplication {


  11.    public static void main(String[] args) {

  12.        SpringApplication.run(SpringcloudFeignApplication.class, args);

  13.    }

  14. }

复制

创建Feign暴露接口,接口上加入@FeignClient(value="service",fallback = FeignFallbackService.class) 注解。 service为要远程调用服务的名字,即你要调用服务的spring.application.name
fallback为远程调用失败后回调的方法。代码如下:

  1. package com.dalaoyang.interfaces;


  2. import com.dalaoyang.back.FeignFallbackService;

  3. import org.springframework.cloud.netflix.feign.FeignClient;

  4. import org.springframework.web.bind.annotation.GetMapping;


  5. /**

  6. * @author dalaoyang

  7. * @Description

  8. * @project springcloud_learn

  9. * @package com.dalaoyang.interfaces

  10. * @email yangyang@dalaoyang.cn

  11. * @date 2018/4/20

  12. */

  13. @FeignClient(value="service",fallback = FeignFallbackService.class)

  14. //这里是要远程调用的服务的名称,即你要调用服务的spring.application.name

  15. //fallback是远程调用失败回调的方法

  16. public interface FeignInterface {

  17.    @GetMapping("/")

  18.    String IndexInfo();

  19. }

复制

远程调用失败回调类FeignFallbackService,要实现对应的FeignClient实现对应的方法:

  1. package com.dalaoyang.back;


  2. import com.dalaoyang.interfaces.FeignInterface;

  3. import org.springframework.stereotype.Service;


  4. /**

  5. * @author dalaoyang

  6. * @Description

  7. * @project springcloud_learn

  8. * @package com.dalaoyang.back

  9. * @email yangyang@dalaoyang.cn

  10. * @date 2018/4/20

  11. */

  12. @Service

  13. public class FeignFallbackService implements FeignInterface {

  14.    @Override

  15.    public String IndexInfo(){

  16.        return "远程调用失败!";

  17.    };

  18. }

复制

最后看一下配置文件,需要注意的是feign.hystrix.enabled,如果配置远程调用回调的话需要声明一下Feign的 hystrix支持,不然页面还是会显示错误。

  1. ##端口号

  2. server.port=8765


  3. ##服务名称

  4. spring.application.name=service_feign


  5. ##注册中心地址

  6. eureka.client.service-url.defaultZone=http://eureka.dalaoyang.cn/eureka/



  7. ##声明Feign的 hystrix支持

  8. feign.hystrix.enabled=true

复制

启动service-feign(8765),先去看一眼http://eureka.dalaoyang.cn

可以看到服务注册成功,然后访问http://localhost:8765/,可以看到页面和使用ribbon的时候一样交替显示。

控制台

然后我们关闭service(8762),service(8763)两个服务,再次访问,可以看到

源码下载 :大老杨码云

个人网站:https://dalaoyang.cn


文章转载自dalaoyang,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论