Feign的简单使用

Ribbon

其实ribbon只负责负载均衡,但是微服务之间通讯必须使用RestTemplate.但是这种方式不符合接口调用的规范,所以推荐使用feign(虽然feign比bibbon的开销稍大了一些).

Feign

Feign的简单配置

有一下几个点需要注意

  • 在使用feign的同时是要使用eureka-client的,所以需要导入eureka-client的启动器.去maven中央仓库搜索eureka,他会让你使用spring-cloud-starter-netflix-eureka-client这个启动器.(不要用spring-cloud-starter-eureka这个启动器)
  • 需要启动spring-boot-starter-web这个启动器,因为feign需要使用bibbon,而bibbon又需要RESTful通信,所以需要启动web的start
  • 关于feign的依赖以前是spring-cloud-starter-feign(不要使用),但是maven中央仓库会让你使用spring-cloud-starter-openfeign这个starter.

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.userService</groupId>
    <artifactId>user-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>user-service</name>
    <description>service project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

application.properties

feign默认开启负载均衡

#用户服务提供者
server.port=25882

#向注册中心注册地址
eureka.register.url=http://127.0.0.1:25881/eureka


#在注册中心显示的名字
spring.application.name=userService

#开启熔断机制
feign.hystrix.enabled=true

#eureka配置,向服务中心eureka注册服务
eureka.client.service-url.defaultZone=${eureka.register.url}

#修改在注册中心的描述信息
eureka.instance.instance-id=userService-provider

info.app.name=userService
info.company.name=com.xh

启动类

@SpringBootApplication
@EnableEurekaClient//自动注册服务到服务中心
@EnableFeignClients//开启feign
public class UserServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }

}

feign远程调用

远程调用这块的坑很多

  • 首先以前版本是不支持@GetMapping或者@PostMapping这两个标签的,需要使用@RequestMapping在里面写使用get还是post方法.

  • post方法不支持多参数传递,比如我下面写了一个String类型的mail和String类型的checkCode这是两个参数,如果使用post会报错无法启动.

  • 每个参数前必须加@RequestParam("")不然也会报错.

  • 我使用的版本对于int String这种参数是可以使用@GetMapping或者@PostMapping这两个标签的,但是如果参数是一个对象,就必须使用@RequestMapping并使用post方法.

@Component
@FeignClient(value = "MAILSERVICE", fallback = SendMailServiceFallback.class)
public interface SendMailService {

    @GetMapping("/check")
    boolean check(@RequestParam("mail") String mail, @RequestParam("checkCode") String checkCode);

    @GetMapping("/sendCheckCode")
    boolean sendCheckCode(@RequestParam("mail") String mail);

}

定义一个接口,声明需要使用的方法,开启Feign的客户端并在类上标注需要去eureka的那个服务中调用(vaule="服务名").

后面的fallback的作用就是熔断(防止服务雪崩),如果这个服务无法调用(默认请求超过50次会启动熔断),就去调用fallback后面的类方法.

并且这个类需要实现上面声明的接口

import com.userservice.feign.SendMailService;
import org.springframework.stereotype.Component;

@Component
public class SendMailServiceFallback implements SendMailService {
    @Override
    public boolean check(String mail, String checkCode) {
        return false;
    }

    @Override
    public boolean sendCheckCode(String mail) {
        return false;
    }
}

之后本服务调用远程服务就可以直接通过上面声明的接口直接使用.

在确保每个步骤都没有问题的情况下可以测试看看.另外远程调用的服务在上文中没有写出.步骤和这个服务基本一致,直接按照这个步骤来就可以,可以不使用feign或者hystrix.

posted @ 2020-03-12 17:49  continued258  阅读(329)  评论(0)    收藏  举报