您的位置:首页 > 编程语言 > Java开发

Spring Cloud【二】—— 微服务调用之FeignClient

2020-07-18 05:18 357 查看

一、应用说明

1、项目开发过程中,出于项目分离考虑、项目访问安全及项目集中化管理考虑,有时候需要建立接口层统一对接底层微服务,向外部暴露接口层访问信息,外部仅能访问接口层,接口获取相关信息拼接后再请求微服务请求,访问时携带bean封装的多对象参数,返回结果为JSON参数,封装成bean对象,本章主要介绍FeignClient请求方式访问方式。
2、本项目中,接口层项目与底层子项目均部署在consul上。
3、FeignClient也支持公网IP地址访问,即支持调用外部http网络通信。

二、consul

1、consul说明

consul是一个服务网格解决方案,可以实现微服务之间相互的调用,consul简化了分布式环境下服务的注册和发现流程,

2、使用流程:

1)consul下载安装

下载地址:https://www.consul.io/downloads.html

2)启动项目前需要先启动consul服务。

服务启用命令:cmd->consul agent -dev

3)在项目中加入依赖

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
  1. 配置文件application.yml
###服务端口号
server:
port: 8406
spring:
####consul注册中心地址
cloud:
consul:
host: localhost
port: 8500
discovery:
hostname: localhost

运行项目,在浏览器输入:http://localhost:8500,可以看到已经注册的项目

3、子项目可发现

被调用的子项目需在启动类application上添加项目可被发现的标志——@EnableDiscoveryClient,将微服务注册到服务发现组件上,让注册中心扫描到该服务

@EnableDiscoveryClient
@SpringBootApplication
public class ChatbotSearchServiceApplication {

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

三、FeignClient

1、使用说明

feign是Springboot cloud体系下的一个重要组件,用于微服务间的调用,底层为httpClient。
feign 暂时不支持GET方式传递bean类封装的多参数对象,feign调用用GET请求传递复杂参数时,底层的urlhttpclient会自动把get方法转为post方法,因此需要针对bean类进行转换,主要有三种方式:
1)将 bean封装的多参数对象拆散成一个一个单独的属性放在方法参数里。(不适用于参数多的案例)
2)使用 GET 传递 @Requestbody(慎用),此方式违反 RESTFul 规范,要求被请求项目参数支持Requestbody,且需要将FeignClient的访问方式替换为apache下的httpclient访问方式。
3)把方法参数变成 Map 传递。
本项目通过第三种方法把方法参数变成 Map 传递实现。

2、pom.xml添加依赖

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

3、application.yml配置超时

feign:
client:
default:
#设置5S超时
connectTimeout: 5000

四、项目实现

1、项目包含主要类说明

1)启动类application
2)访问携带的参数对象bean类RequestVo;
3)返回json结果封装的bean类ResponseVo;
4)controller类
5)接口类、接口实现类;

2、启动类application

需要在主函数上添加注解@EnableFeignClients,使用注解@EnableFeignClients启用feign客户端。

package com.cmic.official;

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

/**
* @author LittlePrince
* @create 2020/7/8 9:36
* @description
*/
@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients
public class OfficialApplication {

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

}

3、访问携带的参数对象bean类RequestVo;

package com.cmcc.offical.vo.search;

import lombok.Data;
import org.springframework.cglib.beans.BeanMap;

import javax.validation.constraints.*;
import java.util.HashMap;
import java.util.Map;

/**
* @author LittlePrince
* @create 2020/7/9 11:04
* @description
*/
@Data
public class RequestVo {
/**
* 关键字(一个或多个)
*/
private String q;
/**
* 返回的结果个数,取值范围是[1, 100]。
* 当前默认值是10。
*/
@Max(value = 100)
@Min(value = 1)
private int num = 10;

4、返回json结果封装的bean类ResponseVo;

package com.cmcc.offical.vo.search;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;

/**
* @author LittlePrince
* @create 2020/7/9 14:04
* @description
*/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResponseVo {

//标识
private String id;

//名称
private String name;

//图标
private String icon;

//描述信息
private String description;
}

5、controller类

package com.cmic.official.controller;
import com.cmic.official.service.IService;
import com.cmic.official.vo.search.RequestVo;
import com.cmic.official.vo.search.ResponseVo;
import org.apache.http.util.TextUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

/**
* @author LittlePrince
* @create 2020/7/8 9:36
* @description
*/
@RestController
public class OfficialController {

private static final Logger LOG = LoggerFactory.getLogger(OfficialController.class);

@Autowired
private IService service;

@RequestMapping(value = "/official/search", method = RequestMethod.GET, produces = "application/json")
public @ResponseBody
ResponseVo search(@Valid RequestVo requestVo) throws Exception {
LOG.info("request=" + requestVo);

ResponseVo responseVo = service.search(new org.apache.commons.beanutils.BeanMap(requestVo));

LOG.info("response=" + responseVo);
return responseVo;
}
  1. 接口类和接口类的实现
    此处接口类方法search必须与被调用子项目的方法保持一致。
    使用注解@FeignClient 定义feign客户端 ,将远程服务映射为一个本地Java方法调用。
package com.cmic.official.service;
import com.cmic.official.vo.search.ResponseVo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.Map;

/**
* 搜索服务的接口
*
* @author LittlePrince
* @create 2020/7/8 9:12
* @description
*/
@FeignClient("search")
public interface IService {

/**
* 根据请求参数实现Chatbot搜索
* @param RequestVo
* @return
*/
@RequestMapping(value = "/botlist", method = RequestMethod.GET, produces = "application/json")
ResponseVo search(@RequestParam Map requestVo);
}

五、项目结果

用户携带参数访问接口地址,接口层内部跳转访问子项目,获取相应的返回结果呈现出来

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: