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搭建注册中心

3.2 启动两个项目服务
在nacos中查看两个服务说明注册成功

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

4 常见问题
- spring-boot 、spring-cloud 以及 spring.cloud.alibaba 版本不一致
5 参考文献
使用nacos作为注册中心实现@FeignClient
windows安装nacos搭建注册中心
@FeignClient注解详解










