`

SpringCloud(二):声明式RestClient—Feign

阅读更多

 (编写不易,转载请注明:http://shihlei.iteye.com/blog/2399457

 

一 概述

 

        feign: 声明式rest 客户端,spring cloud 扩展了feign,提供了springmvc的标签支持,替代RestTemplate简化操作。

        git:https://github.com/OpenFeign/feign

 

二 项目

 

        服务提供者:《 SpringCloud(一): SpringBoot 创建简单的微服务》中的时间微服务——spring-cloud-microservice

        服务消费者:《 SpringCloud(一): SpringBoot 创建简单的微服务》改进——spring-cloud-webfront 中 TimeService 实现

 

三 代码实现

(1)添加依赖

        <!--rest client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>

 

(2)资源文件添加时间微服务服务器配置:

server:
  port: 20001

# 自定义配置
timeMisroService:
  server: http://localhost:10001

 

 

(3)定义feign接口

package x.demo.springcloud.webfront.service.impl.feign;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import x.demo.springcloud.webfront.service.impl.ProtocolResult;

@FeignClient(name = "microservice-time", url = "${timeMisroService.server}")
public interface TimeV1MicroServiceClient {

    @RequestMapping(method = RequestMethod.GET, value = "/time/v1/now", consumes = MediaType.APPLICATION_JSON_VALUE)
    ProtocolResult<String> now(@RequestParam(name = "format", required = false) String format);
}

 

(4)实现TimeService

package x.demo.springcloud.webfront.service;

public interface TimeService {
    /**
     * 获取当前时间
     * @return 当前时间,格式:yyyy-MM-dd HH:mm:ss
     */
    String now();
}

 

package x.demo.springcloud.webfront.service.impl;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import x.demo.springcloud.webfront.service.TimeService;
import x.demo.springcloud.webfront.service.impl.feign.TimeV1MicroServiceClient;

@Service("timeV1FeignImpl")
public class TimeV1FeignImpl implements TimeService {

    @Resource
    private TimeV1MicroServiceClient timeV1MicroServiceClient;

    /**
     * 获取当前时间
     *
     * @return 当前时间,格式:yyyy-MM-dd HH:mm:ss
     */
    @Override
    public String now() {
        ProtocolResult<String> result = timeV1MicroServiceClient.now(null);
        return result.getBody();
    }
}

(5)controller 调用服务

 

package x.demo.springcloud.webfront.web;

import javax.annotation.Resource;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import x.demo.springcloud.webfront.service.TimeService;

@RestController
@RequestMapping("/time")
public class TimeController {

    @Resource(name = "timeV1FeignImpl")
    private TimeService timeService;

    @GetMapping("/now")
    public String now() {
        return timeService.now();
    }
}

 

 

(6)开启FeignClient支持:主要是添加@EnableFeignClients,用于Spring Cloud 生成 实现

 

package x.demo.springcloud.webfront;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.feign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients
public class SpringCloudWebfrontApplication {

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

   

(7)效果:同上篇

四 在普通的项目中使用 feign

区别:因为么有spring cloud 实例FeignClient,所以只能自己实例化FeignClient

 

package x.demo.springcloud.webfront.conf;

import feign.Feign;
import feign.Request;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.netflix.feign.support.SpringMvcContract;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
import x.demo.springcloud.webfront.service.impl.feign.TimeV1MicroServiceClient;

@Configuration
public class SpringConfiguration {

    @Value("${timeMisroService.server}")
    private String timeMisroServiceServer;

    @Bean
    public TimeV1MicroServiceClient timeV1MicroServiceClient() {
        return Feign.builder()
                .encoder(new GsonEncoder())
                .decoder(new GsonDecoder())
                .contract(new SpringMvcContract())
                .options(new Request.Options(5000, 5000))
                .target(TimeV1MicroServiceClient.class, timeMisroServiceServer);
    }

}

 

五 其他

(1)feign 目前不支持Mvc注解 @GetMapping @PostMapping 会报错

 

(2)提供json序列化支持

依赖:

        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-gson</artifactId>
        </dependency>

 

0
0
分享到:
评论
2 楼 ShihLei 2018-03-11  
jxjxtang 写道
public TimeV1MicroServiceClient timeV1MicroServiceClient() { 
        return Feign.builder() 
                .contract(new SpringMvcContract()) 
                .options(new Request.Options(5000, 5000)) 
                .target(TimeV1MicroServiceClient.class, timeMisroServiceServer); 
    } 
这里会有异常,你需要转码
Feign.builder()
                .encoder(new JacksonEncoder())
                .decoder(new JacksonDecoder())

                .contract(new SpringMvcContract())
                .options(new Request.Options(5000, 5000))
                .target(TimeV1MicroServiceClient.class, timeMisroServiceServer);

没粘全
1 楼 jxjxtang 2018-03-03  
public TimeV1MicroServiceClient timeV1MicroServiceClient() { 
        return Feign.builder() 
                .contract(new SpringMvcContract()) 
                .options(new Request.Options(5000, 5000)) 
                .target(TimeV1MicroServiceClient.class, timeMisroServiceServer); 
    } 
这里会有异常,你需要转码
Feign.builder()
                .encoder(new JacksonEncoder())
                .decoder(new JacksonDecoder())

                .contract(new SpringMvcContract())
                .options(new Request.Options(5000, 5000))
                .target(TimeV1MicroServiceClient.class, timeMisroServiceServer);

相关推荐

    Laravel开发-restclient

    2. RestClient:RESTclient是用于测试和调试REST API的工具。在Laravel中开发restclient,可以方便地模拟HTTP请求,如GET、POST、PUT、DELETE等,并接收服务器返回的数据。 三、Laravel开发RESTclient步骤 1. 创建...

    springCloud路由网管负载均衡的简单实现

    在Spring Cloud框架中,路由网关(Zuul或Spring Cloud Gateway)和负载均衡(Ribbon或Netflix Eureka)是两个关键组件,用于构建微服务架构。本文将深入探讨如何在基于Spring Boot 2.0的环境中实现这些功能的简单...

    rest-tester:内置运行RestClient的小型应用程序

    4. 可能还有`LICENSE`文件,声明项目的开源许可协议。 5. 测试文件(如`test/`目录),如果项目包含单元测试或集成测试。 【知识点深入】 1. **RESTful API**:代表“表述性状态转移”,是一种广泛采用的Web服务...

    rest-client-components:RestClient类固醇! 在RestClient周围轻松添加一个或多个Rack中间件,以添加诸如透明缓存(Rack)的功能。

    RestClient类固醇! 想要将透明的HTTP缓存添加到 gem吗? 就像这样简单: require 'restclient/components' require 'rack/cache' RestClient . enable Rack :: Cache RestClient . get ...

    一个springcloud 的demo.zip

    例如,`@EnableEurekaClient` 注解用于开启服务注册和发现,`@Service` 注解标记服务类,`@RestClient` 或 `@FeignClient` 注解用于声明Feign客户端,实现声明式服务调用。开发者可以通过这些注解快速理解和使用...

    Spring Cloud 之 Eureka集群搭建指南-源码

    Spring Cloud Eureka 是 Netflix 提供的一个服务发现组件,它在Spring Cloud框架中扮演着核心角色。本指南将深入探讨如何搭建Eureka集群,以实现高可用的服务注册与发现。 首先,了解Eureka的基本概念。Eureka ...

    restclient

    RESTClient是一款强大的Java客户端工具,专门设计用于测试和调试RESTful Web服务。它为开发者提供了一个直观且便捷的界面,可以方便地发送HTTP请求并接收响应,从而验证API的功能、性能以及正确性。REST...

    restclient--火狐插件

    在Web开发过程中,无论是前端开发者、后端开发者还是软件测试工程师,都可能需要用到RESTClient这样的工具来验证接口的功能和性能。 1. **HTTP请求模拟**: RESTClient允许用户直接在浏览器环境中模拟GET、POST、...

    restclient用法

    1. **下载RESTClient:** - 需要下载`restclient.jar`文件,这是RESTClient的核心组件。 2. **安装Java环境:** - 为了运行RESTClient,您的系统需要安装Java环境,并且要求Java版本不低于1.7。 3. **启动...

    RESTClient

    RESTClient的特点和功能主要包括: 1. **易用性**:RESTClient拥有简洁直观的界面,用户只需输入URL、选择HTTP方法(GET或POST),并设置请求头和请求体,即可快速发起请求。 2. **请求与响应的详细展示**:它会...

    HTTP测试工具 restclient

    它基于请求与响应模型,客户端(如浏览器或restclient)发送请求到服务器,服务器处理请求后返回响应。 在restclient-ui-3.2.2中,你可以执行以下操作: 1. **模拟请求**:你可以创建GET、POST、PUT、DELETE等不同...

    restClient

    1. **安装与启动**:下载并解压缩restclient-ui-3.7.1.zip文件,解压后进入restclient-ui-3.7.1\restclient-ui-3.7.1\bin目录,双击运行restclient-ui.bat脚本,即可启动RestClient界面。 2. **界面操作**:启动后...

    Wisdom RESTClient V1.2

    ### 二、RESTClient的核心特性 1. **支持RESTful API**:REST(Representational State Transfer)是一种广泛采用的Web服务架构风格,RESTClient支持各种HTTP方法(GET, POST, PUT, DELETE等)以及常见的HTTP头部和...

    RestClient

    RestClient是一款轻量级的接口调试工具,与PostMan类似,专为开发者设计,用于测试和验证RESTful Web服务。它的简洁性和易用性使其在Java开发者社区中广受欢迎。这款工具无需安装,只需Java运行环境支持,通过双击...

    netdot-restclient:Ruby中的Netdot REST客户端

    Netdot :: RestClient 网络文档工具的RESTful API Ruby客户端 安装 将此行添加到您的应用程序的Gemfile中: gem 'netdot-restclient' 然后执行: $ bundle 或将其自己安装为: $ gem install netdot-restclient ...

    Python库 | hs_restclient-1.3.4.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:hs_restclient-1.3.4.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    FireMonkey idhttp RestClient访问 SSL

    RESTClient: TRESTClient; RESTRequest: TRESTRequest; RESTResponse: TRESTResponse; begin RESTClient := TRESTClient.Create('https://your.ssl.url'); RESTClient.BaseURL := 'https://your.ssl.url'; ...

    restclient-cli-3.2.2

    `restclient-cli-3.2.2` 是一个命令行接口(CLI)工具,专门用于测试RESTful API。它的设计目的是让开发人员和自动化测试工程师能够便捷地通过脚本方式执行HTTP请求,从而验证API的功能和性能。这个工具在Windows和...

Global site tag (gtag.js) - Google Analytics