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 版本不一致