Fegin Client-入门小试

Fegin Client-入门小试

文章目录

1 接口提供者

1.1 配置 :pom.yml 和 bootstrap.yml

1) pom.xml 添加以下依赖

artifactId 说明 版本
spring-cloud-starter-alibaba-nacos-discovery nacos注册中心依赖包
spring-boot-starter-actuator 监控检查
spring-cloud-starter-alibaba-nacos-config nacos配置中心依赖支持
spring-cloud-dependencies Spring Cloud begin Greenwich.SR2
spring-cloud-alibaba-dependencies Spring Cloud Alibaba begin 2.1.0.RELEASE
  • 注意版本问题,spring-boot 、spring-cloud 以及 spring.cloud.alibaba

  • 和 的区别

    主要管理版本,对于子类继承同一个父类是很有用的,集中管理依赖版本不添加依赖关系,对于其中定义的版本,子pom不一定要继承父pom所定义的版本。 中的jar直接加到项目中,管理的是依赖关系(如果有父pom,子pom,则子pom中只能被动接受父类的版本);

2) bootstrap.yml

  • bootstrap.yml和application.yml的区别

    a. 使用spring cloud 需要bootstrap.yml在项目加载之前提供server配置信息,作为引导配置。

server:
  port: 9005
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/myqx?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password: 1234
  application:
    name: itcast-map
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848

1.2 提供接口

@Autowired
private UserInfoService userInfoService;

@GetMapping("/get")
public List<UserInfo> findAll() {
    List<UserInfo> result = userInfoService.findAll();
    return result;
}

这里只暴露了配置和接口,细节上就是CURD的简单接口实现,不必关注,知道调通了就行

2 服务调用者

2.1 配置 :pom.yml 和 bootstrap.yml

相比服务提供者不需要业务依赖项,如mybatis-plus、mysql等,同样需要nacos注册中心依赖包、监控检查、nacos配置中心依赖,需要添加远程调用和Feign依赖。

<properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <!-- Spring Cloud 版本信息 -->
        <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
        <!--  Spring Cloud Alibaba 版本信息 -->
        <spring.cloud.alibaba.version>2.1.0.RELEASE</spring.cloud.alibaba.version>
</properties>
<!-- 父工程 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.6.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<dependencyManagement>
    <dependencies>
        <!-- Spring Cloud begin-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- Spring Cloud end-->
        <!-- Spring Cloud Alibaba begin-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring.cloud.alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- Spring Cloud Alibaba end -->
    </dependencies>
</dependencyManagement>

<dependencies>
    <!--SpringMVC-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--工具包-->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
    </dependency>
    <!-- lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.10</version>
        <scope>provided</scope>
    </dependency>
    <!-- restTemplate 远程调用 -->
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.5</version>
    </dependency>
     <!-- nacos注册中心依赖包 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!-- 监控检查-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <!-- nacos配置中心依赖支持 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>

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

2) bootstrap.yml

server:
  port: 9013

spring:
  application:
    name: itcast-nacos
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848

2.2 启动类

在启动类上需要添加@SpringBootApplication、@EnableDiscoveryClient、@EnableFeignClients

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients    // 开启远程调用
public class NacosApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosApplication.class, args);
    }

}

2.3 接口

与接口调用者在Controller写接口不一样的是,服务调用者是创建接口类的方式使用@FeignClien注解实现

  • @FeignClien注解

    @FeignClient标签的常用属性如下:

    • name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现

    • url: url一般用于调试,可以手动指定@FeignClient调用的地址

    • decode404:当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException

    • configuration: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract

    • fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口

    • fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码

    • path: 定义当前FeignClient的统一前缀

    1、接口提供方在注册中心。

    如果服务提供方已经注册到注册中心了,那么name或者value的值为:服务提供方的服务名称。必须为所有客户端指定一个name或者value
    @FeignClient(value=“run-product”,fallback = ProductClientServiceFallBack.class)

    2、单独的一个http接口,接口提供方没有注册到注册中心。
    @FeignClient(name=“runClient11111”,url=“localhost:8001”)
    此处name的值为:调用客户端的名称。

@FeignClient(value = "itcast-map",fallback = UserHystrix.class)
public interface UserFegin {

    @GetMapping("user/get")
    public List<UserInfo> findAll();
}

2.4 容错处理类

@Component
public class UserHystrix implements UserFegin {
@Override
public List<UserInfo> findAll() {
    return null;
	}
}

2.5 UserController

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private UserFegin userFegin;

    /**
     * 参数
     * @return
     */
    @GetMapping("/test006")
    public String feignClien() {
        List<UserInfo> all = userFegin.findAll();
        System.out.println(all);
        return "myqxin";
}

3 nacos

3.1 启动本地nacos

没有搭建nacos的可以参考 windows安装nacos搭建注册中心

Fegin Client-入门小试

3.2 启动两个项目服务

在nacos中查看两个服务说明注册成功

Fegin Client-入门小试

请求:http://localhost:9013/user/test006 ,效果如下

Fegin Client-入门小试

4 常见问题

  • spring-boot 、spring-cloud 以及 spring.cloud.alibaba 版本不一致

5 参考文献

使用nacos作为注册中心实现@FeignClient

windows安装nacos搭建注册中心

@FeignClient注解详解

上一篇:【TcaplusDB知识库】Tcaplus Go SDK手册(一)


下一篇:读懂才会用:Redis ZSet 的几种使用场景