spring cloud 入门实践系列

来源:互联网 发布:死飞自行车多少钱淘宝 编辑:程序博客网 时间:2024/06/06 03:12

Spring cloud对feign的定义
http://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/1.3.1.RELEASE/

Feign is a declarative web service client. It makes writing web service clients easier. To use Feign create an interface and annotate it. It has pluggable annotation support including Feign annotations and JAX-RS annotations. Feign also supports pluggable encoders and decoders. Spring Cloud adds support for Spring MVC annotations and for using the same HttpMessageConverters used by default in Spring Web. Spring Cloud integrates Ribbon and Eureka to provide a load balanced http client when using Feign.

Feign是一个声明式的Web服务客户端。 它使得Web服务客户端的写入更加方便 要使用Feign创建一个界面并对其进行注释。 它具有可插拔注释支持,包括Feign注释和JAX-RS注释。 Feign还支持可插拔编码和解码。 Spring Cloud增加了对Spring MVC注释的支持,并且使用了在Spring Web中默认使用的相同的HttpMessageConverter。 Spring Cloud集成了Ribbon和Eureka,在使用Feign时提供负载的http客户端。

Feign官方的定义
https://github.com/OpenFeign/feign

Feign is a java to http client binder inspired by Retrofit, JAXRS-2.0, and WebSocket. Feign’s first goal was reducing the complexity of binding Denominator uniformly to http apis regardless of restfulness.

Feign是由Retrofit,JAXRS-2.0和WebSocket推崇的一个java到http客户端绑定。 Feign的首要目标是降低Denominator到http apis之间的复杂性。


总结来说:Feign提供了对远端服务访问的封装,其友好的支持了各种httpclient客户端,比如OkHttpClient,RibbonClient等,各种数据格式化插件,比如GSON,Jackson,Sax,JAXB等。


如下我将展示一个对feign实际使用的小例子,帮助大家熟悉feign的作用与使用方法,feign本身是一个client应用用来调远端服务,我们要先准备一个远端服务,此处远端服务我使用eureka提供。
备注:eureka服务是需要先启动一个eureka server充作注册中心,此处我不赘述,如果你不知道如何启动一个eureka server,可以参考之前的文章。

创建远端eureka服务

项目结构

这里写图片描述

pom文件引入必要的jar包

        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>1.5.4.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>Dalston.SR2</spring-cloud.version>    </properties>    <dependencies>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-eureka</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>

application.yml配置

eureka:  client:    serviceUrl:      defaultZone: http://localhost:8761/eureka/server:  port: 8769spring:  application:    name: service-calc

提供一个服务类

import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;/** * Created by zhangxiaolong on 17/7/24. */@RestController@RequestMapping("calc")public class FeignCalcController {    /**     * 加法     *     * @param firstNum     * @param secondNum     * @return     */    @RequestMapping("add")    public int doAdd(@RequestParam("firstNum") int  firstNum,@RequestParam("secondNum")  int  secondNum){        return firstNum+secondNum;    }    /**     * 减法     *     * @param firstNum     * @param secondNum     * @return     */    @RequestMapping("sub")    public int doSub(@RequestParam("firstNum") int  firstNum,@RequestParam("secondNum") int  secondNum){        return firstNum-secondNum;    }    //... and so on}

eureka服务启动入口类

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@EnableEurekaClient@SpringBootApplicationpublic class FeigntestserverApplication {    public static void main(String[] args) {        SpringApplication.run(FeigntestserverApplication.class, args);    }}

eureka服务启动

这里写图片描述

创建feign应用

应用结构

这里写图片描述

pom导入必要jar依赖

    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>1.5.4.RELEASE</version>        <relativePath/>     </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>Dalston.SR2</spring-cloud.version>    </properties>    <dependencies>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-feign</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-eureka</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-eureka</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>

编写feign客户端类

import org.springframework.cloud.netflix.feign.FeignClient;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;/** * Created by zhangxiaolong on 17/7/24. */@FeignClient("service-calc")public interface CalcFeignClient {    @RequestMapping("calc/add")    public int add(@RequestParam("firstNum") int firstNum,@RequestParam("secondNum") int secondNum);    @RequestMapping("calc/sub")    public int sub(@RequestParam("firstNum") int firstNum,@RequestParam("secondNum") int secondNum);}

@FeignClient(“service-calc”) 是对远端eureka 的service-calc服务的引用
接口中的两个方法也是对远端eureka 的service-calc服务的调用,注意 @RequestMapping的路径一定要与远端的调用路径保持一致。
从这里就可以看出,feign提供了对远端服务的包装且实现了对远端服务对调用。

编写feign服务类

import com.zhang.feignclient.CalcFeignClient;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;/** * Created by zhangxiaolong on 17/7/24. */@RestController@RequestMapping("feign-calc")public class CalcController {    @Resource    private CalcFeignClient calcFeignClient;    @RequestMapping("feignAdd")    public int feignAdd(@RequestParam("firstNum") int firstNum,@RequestParam("secondNum") int secondNum){        return calcFeignClient.add(firstNum,secondNum);    }    @RequestMapping("feignSub")    public int feignSub(@RequestParam("firstNum") int firstNum,@RequestParam("secondNum") int secondNum){        return calcFeignClient.sub(firstNum,secondNum);    }}

CalcController中封装了feign客户端类

编写feign客户端启动类

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;import org.springframework.cloud.netflix.feign.EnableFeignClients;import org.springframework.context.annotation.Configuration;@EnableEurekaClient@EnableFeignClients@SpringBootApplicationpublic class FeignApplication {    public static void main(String[] args) {        SpringApplication.run(FeignApplication.class, args);    }}

启动feign客户端测试

这里写图片描述

这里写图片描述

到此大家应该恍然大悟了,浏览器分别访问了CalcController的两个方法,CalcController又调用了CalcFeignClient中的两个方法,CalcFeignClient实现了对远程eureka两个方法的调用且正确的返回了结果。

原创粉丝点击