Java面经 2019-03-05 16:00:00
作者:cuifuan 公众号:Java知音
Feign是一个声明式的Web服务客户端。
是什么?
例如我在一个服务的interace上注解@FeignClient(value = "eureka-client") 就是声明服务名称 告诉其他服务等这个就是eureka-client 的服务客户端,它使编写Web服务客户端变得更容易
要使用Feign,请创建接口并注解, 有可插入的注解支持,包括Feign注释和JAX-RS注释。
JAX-RS注释: JAX-RS是JAVAEE6 引入的,JAX-RS即Java API for RESTful Web Services, 是Java的应用程序接口,如:
Feign还支持可插拔编码器和解码器。
Spring Cloud Netflix 为 Feign提供了下面默认的配置Bean Decoder feignDecoder: ResponseEntityDecoder Encoder feignEncoder: SpringEncoder
Spring Cloud增加了对Spring MVC注释的支持,并使用了Spring Web中默认使用的相同HttpMessageConverters。
Spring Cloud集成了Ribbon和Eureka,在使用Feign时提供负载均衡的http客户端。
白话文:微服务架构端口很多,我们要统一端口就要用到Feign去各个服务拿接口;需要从一个服务调用另外一个服务的数据也可以直接使用Feign,也就是通过这种方式开发调用远程服务就像是调用本地服务一样方便。
准备工作
创建eureka-client服务
gradle配置 build.gradle
创建启动类 ToolsEurekaClientApplication.java
资源文件 application.yml
eureka: client: service-url: defaultZone: http://127.0.0.1:8761/eureka/ server: port: 8762 spring: application: name: eureka-client
业务接口 UserService.java
package store.zabbix.toolseurekaclient.service; import store.zabbix.common.entity.User; import java.util.List; public interface UserService { Integer createUser(User user); ListgetUserAll(String username,Long id); Integer updateUser(User user); Integer deleteUser(List ids); }
业务实现层 UserServiceImpl.java
控制层 UserController.java
由上面的server.port 可知端口为8762。
可是如果我们有多个eureka-client,会造成后端接口访问端口太多。
所以在这里可以采用feign进行统一调度
新建tools-routing服务
build.gradle
dependencies { implementation "org.springframework.cloud:spring-cloud-starter-openfeign" implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-hystrix' }
新建的是子项目,依赖管理统一在父项目,子项目只声明自己单独使用的依赖,父项目在github可以进行拉取,地址在上面
启动类 ToolsRoutingApplication.java
核心就是开启@EnableFeignClients注解
application.yml
创建UserServiceClients调用eureka-client接口
@FeignClient是核心, @FeignClient里value的值是eureka-client的application.yml声明的,(??上面下面是上面关系,作者这里写的不是很好)如下:
spring: application: name: eureka-client
启动ToolsRoutingApplication.java
发现启动报错
说明: @GetMapping在这个版本可以使用,其传值要使用@RequestParam 在一些版本无法使用@GetMapping,需使用@RequestMapping(value = "user",method = RequestMethod.GET)
UserServiceClients接口
说明:PUT和DELETE请求,使用json传输List时或许会报错,请在注解内加上参数produces = "application/json",如@DeleteMapping(value = "user",produces = "application/json")
创建 UserController.java 控制访问层
Postman 测试结果
查询
添加
修改
删除
有postman的可以使用下面的链接:
https://www.getpostman.com/collections/8f56e7246e290e8036f0
SpringCloud各版本出现的问题坑等很多,遇到问题尽量自行解决,收获才会有很多