SpringCloud之声明式服务调用 Feign(三)

一 Feign简介html

Feign是一种声明式、模板化的HTTP客户端,也是netflix公司组件。使用feign能够在远程调用另外服务的API,若是调用本地API同样。
咱们知道,阿里巴巴的doubbo采用二进制的RPC协议进行底层通信,客户端可使用相似本地方法同样调用。那么,虽然Feign一样能够有这种效果,可是底层仍是经过HTTP协议调取restful的API的方式。
经过Feign, 咱们能把HTTP远程调用对开发者彻底透明,获得与调用本地方法一致的编码体验。java

在实际开发中,对于服务依赖的调用可能不止一处,每每一个接口会被多处调用,因此咱们一般会针对各个微服务自行封装一些客户端类来包装这些依赖服务的调用,Spring Cloud Feign 在此基础上作了进一步的封装,由他来帮助咱们定义和实现依赖服务接口的定义,咱们只须要建立一个接口并用注解的方式来配置他,便可完成对服务提供方的接口绑定,简化了在使用 Spring Cloud Ribbon 时自行封装服务调用客户端的开发量。git

搭建声明式服务Feign(feign-client)

接到上篇“SpringCloud之实现客户端的负载均衡Ribbon(二)web

继续在springcloud工程中添加模块feign-client,也是经过start.spring.io提供的模板建立spring

新的目录apache

生成的pom.xml文件为restful

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.xuan</groupId>
    <artifactId>feign-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>feign-client</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

修改启动文件FeignClientApplication.java,增长相关注解。app

package com.xuan.feignclient;

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

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class FeignClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(FeignClientApplication.class, args);
    }
}

增长 @FeignClient 注解的接口来绑定具体的服务,增长服务HelloService.java负载均衡

package com.xuan.feign;

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

@FeignClient(value = "eureka-client")
public interface HelloService {
    @RequestMapping(value = "/hello")
    String hello();
}

@FeignClient可使用name和url来绑定。 之前使用@FeignClient注解的时候使用url参数的使用就不须要使用name属性了,如今否则,须要在url属性的基础上也要使用name属性,此时的name属性只是一个标识。value和name互为别名,只须要设置一个就能够了。maven

比较有用的四个注解 name , url, fallback , path

  • name 指定微服务的实例名称,惟一,必填,经过实例名称能够获得实例对应的访问地址
  • fallback 配置熔断
  • url 配置一个绝对的地址访问,默认为空字符串,当其不空时,则使用该地址访问
  • path 配置一个全部方法级别的mappings 至关于在类上加 requestMapping, 例如上面的 UserServiceAPI 全部访问地址为 /user/xxx

增长测试的消费接口ConsumerController.java

 

package com.xuan.feign;

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

@RestController
public class ConsumerController {
    @Autowired
    HelloService helloService;

    @RequestMapping(value = "feign-consumer", method = RequestMethod.GET)
    public String helloConsumer(){
        return helloService.hello();
    }
}

修改配置文件”application.properties“,找到注册中心和定义自身的服务名和端口,

spring.application.name=feign-consumer
server.port=9991
eureka.client.service-url.defaultZone=http://localhost:8080/eureka/

添加完成后工程的目录结构为

分别启动模块了:

1.EurekaServerApplication

2.EurekaClientApplication,EurekaClientApplication1,EurekaClientApplication2

3.FeignClientApplication

 启动后打开http://localhost:8080/显示如图:

访问Feign模块提供的接口http://localhost:9991/feign-consumer,刷新一次也会访问到不一样的提供者上面去,缘由是feign内部也使用了ribbon作负载均衡。

源码地址:https://gitee.com/xuantest/SpringCloud-Feign

相关文章
相关标签/搜索