SpringCloud 服务调用 Feign
这节我们来实现下服务调用,之前在Ribbon中实现的时候,发现调用其他的服务还是需要通过RestTemplate来调用,现在既然所有的服务都注册到了SpringCloud中,那么我们是否有其他的方式呢。
SpringCloud提供了Feign,直接通过服务名称和对应接口进行调用,这样,就像调用项目自己的服务内容一样
(一)简介
Feign是一个声明式的Web服务客户端。这使得Web服务客户端的写入更加方便 要使用Feign创建一个界面并对其进行注释。它具有可插入注释支持,包括Feign注释和JAX-RS注释。Feign还支持可插拔编码器和解码器。Spring Cloud增加了对Spring MVC注释的支持,并使用Spring Web中默认使用的HttpMessageConverters
。Spring Cloud集成Ribbon和Eureka以在使用Feign时提供负载均衡的http客户端。
(二)实现
工程依旧是基于之前的工程继续实现,之前的项目Spring Eureka实现,Spring Cloud Ribbon实现
在项目中建立新的module,和之前建立项目一样,只是配置中增加Feign
我这边工程名字是SPRING-FEIGN-SERVICE
对应新增的pom.xml内容是:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在项目的启动类上加上注解@EnableDiscoveryClient加入SpringCloud Eureka服务端,加上注解@EnableFeignClients声明为声明性REST客户端:Feign
package com.springcloudfeign.feign;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class FeignApplication {
public static void main(String[] args) {
SpringApplication.run(FeignApplication.class, args);
}
}
然后建立一个FeignDemoService的接口:
package com.springcloudfeign.feign.service;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@FeignClient(value = "SPRING-CLIENT-01")
public interface FeignDemoService {
@RequestMapping(value = "getInfo/show" , method = RequestMethod.GET)
String getPortTwo();
}
接口上方加上@FeignClient(value = “SPRING-CLIENT-01”)说明这个接口调用的是之前微服务项目SPRING-CLIENT-01的服务,然后通过 @RequestMapping(value = “getInfo/show” , method = RequestMethod.GET)声明调用的是SPRING-CLIENT-01中web中/getInfo/show这个接口。
增加FeignController:
package com.springcloudfeign.feign.web;
import com.springcloudfeign.feign.service.FeignDemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController("/")
public class FeignController {
@Autowired
FeignDemoService feignDemoService ;
@GetMapping("getInfoTwo")
public String getInfoTwo()
{
return feignDemoService.getPortTwo();
}
}
这里写完之后 feignDemoService下会有红线提示,但不要紧,可以直接执行。
配置文件application.properties内容:
server.port = 10010
eureka.client.serviceUrl.defaultZone= http://localhost:12345/eureka/
spring.application.name= SPRING-FEIGN-SERVICE
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testmysql
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.max-idle=10
spring.datasource.max-wait=10000
spring.datasource.min-idle=5
spring.datasource.initial-size=5
然后启动之前的CLOUD-SERVER,以端口号10001,10002依次启动SPRING-CLIENT-01服务,启动Ribbon服务,再启动这个Feign服务。我这边端口号配置的是10010,在postman或者浏览器中输入:
http://localhost:10010/getInfoTwo
多刷几次,可以看到分别调用了两个接口的的SPRING-CLIENT-01服务。
执行的结果和ribbon不同,是依次调用两个端口
本次代码github地址:源码地址
还没有评论,来说两句吧...