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地址:源码地址

猜你喜欢

转载自blog.csdn.net/harryptter/article/details/88076608