Spring Cloud学习(三):Feign声明式服务调用

1. Feign介绍

之前用到Ribbon,但是每个接口都要去拼接参数,会比较麻烦。而Feign可以理解为就是在Ribbon上加了一层封装,让我们在调用服务的时候不用处理那些麻烦的参数了

2.代码实现

    1. 新建一个Feign服务

      • 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 http://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.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.pikaqiu.springcloud</groupId>
    <artifactId>feign</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringCloud-Feign</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR2</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-starter-test</artifactId>
            <scope>test</scope>
        </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.yml

server:
  port: 5002
spring:
  application:
    name: feign
eureka:
  client:
    service-url:
        defaultZone: http://eureka-server1:3001/eureka/,http://eureka-server2:3002/eureka/
  instance:
    instance-id: Feign
      • 在项目启动类中,添加注解@EnableEurekaClient 和 @EnableFeignClients

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class SpringCloudFeignApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudFeignApplication.class, args);
    }
}
      • 接下来是核心的接口定义。新建一个接口FeignService.java。其中@FeignClient参数对应客户端名称

/**
 * @author 吕梁山
 * @date 2019/7/17
 */
@FeignClient("eureka-client")
public interface FeignService {
    @RequestMapping("test")
    String test(String userName);
}
    1. 现在eurek中可以看到已经注册了两个client服务一个feign服务!

20190718142723225.png

  1. 测试 访问

http://localhost:5002/test?userName=测试

会发现Feign会去轮询访问两个client服务

此次服务端口号:4001,接收到的参数:测试
此次服务端口号:4002,接收到的参数:测试

3. 更换负载均衡策略

Feign默认的策略是轮训,也就是挨个访问每个服务,也可以自己更换策略或者已定义策略,com.netflix.loadbalancer包下有很多种定义好的策略,可以自己选择,同样可以参照写好的策略类自己写一个策略类

eureka-client:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
  • eureka-client 需要进行负载均衡的服务name

  • NFLoadBalancerRuleClassName 策略类路径,如果是自定义就写自己项目里的路径

欢迎留言:http://pikaqiu.vip/article/2368.html
示例代码:https://github.com/Liangshan1994/SpringCloud

猜你喜欢

转载自www.cnblogs.com/liangshandada/p/11212268.html