如何优雅的使用Fegin去构造通用的服务调用的API

简介: 如何优雅的使用Fegin去构造通用的服务调用的API

第一步:

创建一个公共的API服务:命名为api(根据自己实际情况进行命名)

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.stuyd.cloud</groupId>
    <artifactId>api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>api</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    </properties>
    <dependencies>
        <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>

第二步:创建调用的API

/**
 * name属性代表要调用的服务,不区分大小写
 * fallback代表服务熔断调用的方法,类似还是有fabllbackFactory,后续介绍
 * decode404为true代表404状态码不进入fallback逻辑
 * path配置全局路径,类型类上使用@RequestMapping
 */
@FeignClient(name = "eureka-client", fallback = FallBack.class, decode404 = true,path = "/client")
public interface FeignApi {
    @PostMapping("/hello/{who}")
    String hello(@PathVariable(value = "who") String who) throws Exception;
}

第三步:在调用的服务中,创建实际的实现逻辑

@RequiredArgsConstructor
@Slf4j
@RestController
//这个地方记得要跟上面的path属性中的值保持一致
@RequestMapping("/client")
public class ClientController implements FeignApi {
    private final DiscoveryClient discoveryClient;
    @Override
    public String hello(String who) throws Exception {
        Annotation[] annotations = this.getClass().getAnnotations();
        System.out.println(1111);
        Thread.sleep(3000);
        List<String> services = discoveryClient.getServices();
        services.forEach(s -> {
            List<ServiceInstance> instances = discoveryClient.getInstances(s);
            instances.forEach(serviceInstance -> {
                System.out.println(serviceInstance.getHost());
                System.out.println(serviceInstance.getInstanceId());
            });
        });
        return "hello, " + who;
    }
}

第四步:实现fallback逻辑

1.这种方案拿不到致使服务降级的错误码,可能导致无法做一些针对性的处理

@Component
public class FallBack implements FeignApi {
    @Override
    public String hello(String who) throws Exception {
        return "error";
    }
}

@FeignClient(name = “eureka-client”, fallbackFactory = FallBack.class, decode404 = true,path = “/client”),如上修改一下,采用fallbackFactory 的方式

@Component
public class FallBack implements FallbackFactory<FeignApi> {
    @Override
    public FeignApi create(Throwable throwable) {
        return who -> throwable.getMessage();
    }
}
相关文章
|
6月前
|
JavaScript API
【vue实战项目】通用管理系统:api封装、404页
【vue实战项目】通用管理系统:api封装、404页
76 3
|
5月前
|
JavaScript 前端开发 测试技术
【vue实战项目】通用管理系统:api封装、404页
【vue实战项目】通用管理系统:api封装、404页
41 3
|
6月前
|
前端开发 JavaScript API
TS 中的类型验算,高级通用 API 实现
这篇文章介绍了一些常用的类型通用API封装,包括TS内置类型和关键字的使用,以及TS compiler内部实现的类型。文章截取了一些常用的类型定义和API示例,如Partial、Required、Readonly、NonNullable、Parameters等。还介绍了一些常用的TS关键字,如extends、infer、keyof、typeof、in等。此外,文章还提供了一些实现示例,如Optional API、GetOptional API和UnionToIntersection API。该文章会不断更新。
|
机器学习/深度学习 人工智能 自然语言处理
通用人工智能综述 从背景介绍到API调用
通用人工智能综述 从背景介绍到API调用
117 0
|
6月前
|
SQL 前端开发 Java
三级分类的数据表设计和构造API数据
三级分类的数据表设计和构造API数据
83 0
|
机器学习/深度学习 人工智能 文字识别
从图片提取文字的终极解决方法 ——【通用文字识别 API】
通用文字识别技术,也称为OCR(Optical Character Recognition,光学字符识别),就是一种将图像或扫描件中的文字识别出来并转化为可编辑、可搜索的数字化文本的技术。
774 1
从图片提取文字的终极解决方法 ——【通用文字识别 API】
|
前端开发 网络协议 Java
Servlet运行原理_API详解_请求响应构造进阶之路(Servlet_2)
Servlet运行原理_API详解_请求响应构造进阶之路(Servlet_2)
112 0
Servlet运行原理_API详解_请求响应构造进阶之路(Servlet_2)
|
设计模式 测试技术 API
干货 | 通用 api 封装实战,带你深入理解 PO
干货 | 通用 api 封装实战,带你深入理解 PO
|
设计模式 JSON 测试技术
干货 | 通用 api 封装实战,带你深入理解 PO
干货 | 通用 api 封装实战,带你深入理解 PO
|
设计模式 API
接口测试框架实战(四) | 通用 API 封装实战
接口测试框架实战(四) | 通用 API 封装实战

热门文章

最新文章