数据库实验九--OpenGauss(使用JDBC
853 2023-04-03 05:07:06
官网手册:https://www.springcloud.cc/spring-cloud-dalston.html
Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。SpringCloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。
先看一下服务提供者的Controller层
@RestControllerpublic class UserController { @Autowired private UserService userService; @RequestMapping("/get") public String getUser(){ return "123"; } @RequestMapping("/getUsername") public User getUserByName(@RequestParam("username") String username){ return userService.getUserByName(username); }
}
然后编写消费者
Maven,需要导入Eureka和Feign的依赖
<!--Feign注解--><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--Eureka-Client依赖--><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
application.yml
server: port: 8080eureka: client: register-with-eureka: false #不向Eureka注册自己 service-url: defaultZone: http://Eureka-Server1:7001/eureka/,http://Eureka-Server2:7002/eureka/ #Eureka集群只需要用逗号分隔即可
定义一个接口,这里写在了service下
这里需要注意,该地方的请求路径必须对应上Eureka上的服务所提供的路径,说白了,就是这里的路径必须和服务提供者的controller层里的路径一致
@Component@FeignClient(value = "SPRINGCLOUD-PROVIDER-USER") //Eureka上的服务注册名public interface UserClientService { @RequestMapping("/get") public String getUser(); @RequestMapping("/getUsername") public User getUserByName(@RequestParam("username") String username);}
controller,这里的访问路径则可以不一致,这里也是我们最终要访问的路径
@RestControllerpublic class UserController { //feign实现的话,这里就直接注入feign定义的那个接口就好了 @Autowired private UserClientService userClientService = null; @RequestMapping("/consumer/getUser") public String getUser(){ return this.userClientService.getUser(); } @RequestMapping("/consumer/getUsername") public User getUserByName(@RequestParam("username") String username){ return this.userClientService.getUserByName(username); }}
启动类
@SpringBootApplication@EnableEurekaClient@EnableFeignClientspublic class SpringcloudConsumerUserFeignApplication { public static void main(String[] args) { SpringApplication.run(SpringcloudConsumerUserFeignApplication.class, args); }}
上方Feign是在消费端实现的,然后我们在服务提供者的API上也实现一下
service里的内容其实还是一样的
@Component@FeignClient(value = "SPRINGCLOUD-PROVIDER-USER")public interface UserClientService { @RequestMapping("/get") public String getUser(); @RequestMapping("/getUsername") public User getUserByName(@RequestParam("username") String username);}
只不过此时服务提供者的API需要导入Feign的依赖
<!--Feign注解--><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
消费端调用服务提供者的API即可
然后这时候的消费端就更加简洁了,此时的消费端只需要在Maven中导入服务提供者的API和Eureka即可,Feign依赖在服务提供者的API里存在了,所以这里不需要再进行导入
<!--服务提供者的API--><dependency> <groupId>org.example</groupId> <artifactId>springcloud-api</artifactId> <version>1.0-SNAPSHOT</version></dependency><!--Eureka-Client依赖--><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
然后就是启动类有一点变化,这里Feign项需要指定到我们服务提供者API的路径
@SpringBootApplication@EnableEurekaClient@EnableFeignClients(basePackages = {"com.chen.springcloudapi"}) //写在消费端的话其实可以不用编写basePackagespublic class SpringcloudConsumerUserFeignApplication { public static void main(String[] args) { SpringApplication.run(SpringcloudConsumerUserFeignApplication.class, args); }}
controller层无需改动,直接@Autowired即可使用
@RestControllerpublic class UserController { //feign实现的话,这里就直接注入feign定义的哪个接口就好了 @Autowired private UserClientService userClientService = null; @RequestMapping("/consumer/getUser") public String getUser(){ return this.userClientService.getUser(); } @RequestMapping("/consumer/getUsername") public User getUserByName(@RequestParam("username") String username){ return this.userClientService.getUserByName(username); }}
application.yml文件也无需改动,Eureka该配置配置
server: port: 8080eureka: client: register-with-eureka: false #不向Eureka注册自己 service-url: defaultZone: http://Eureka-Server1:7001/eureka/,http://Eureka-Server2:7002/eureka/ #Eureka集群只需要用逗号分隔即可
至于Feign到底是写在消费端还是服务提供者API上,其实两者情况都有,但是写在服务提供者API上的话,多个消费端去调用时不需要重复编写Feigin。