TypechoJoeTheme

香草物语

统计
登录
用户名
密码
/
注册
用户名
邮箱
输入密码
确认密码

Spring Cloud使用OpenFeign调用Nacos服务提供者

Laughing博主
2021-07-27
/
0 评论
/
873 阅读
/
690 个字
/
百度已收录
07/27
本文最后更新于2024年03月17日,已超过42天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

什么是OpenFeign

OpenFeign为微服务架构下服务之间的调用提供了解决方案,OpenFeign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求。Spring Cloud 2020版本已经彻底移除了Netflix相关组件,OpenFeign便是Feign的替换者。
本文我们是在Spring Cloud使用Nacos作为服务中心编写服务提供者的基础上进行的,通过OpenFeign调用前面编写的nacos-provider-payment服务。

编写服务消费者

创建cloudalibaba-consumer-order8888工程,调用我们编写的nacos-provider-payment服务。

添加依赖

<?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">
    <parent>
        <artifactId>Cloud2020</artifactId>
        <groupId>net.xiangcaowuyu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloudalibaba-consumer-order9003</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.5</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
    </dependencies>

</project>

修改配置文件

修改application.yml增加Nacos相关配置。

server:
  port: 8888
spring:
  application:
    name: nacos-consumer-order
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.120.180:1111
management:
  endpoints:
    web:
      exposure:
        include: "*"

修改启动类

添加@EnableFeignClients注解,支持使用OpenFeign

@SpringBootApplication
//@EnableDiscoveryClient
@EnableFeignClients
public class NacosConsumerOrderMain8888 {

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

}

编写Feign客户端

添加@FeignClient注解,value便是我们服务提供者的名称。

@FeignClient(value = "nacos-provider-payment")
public interface NacosPaymentService {

    @GetMapping(value = "/echo/{string}")
    String echo(@PathVariable("string") String string);
}

测试

编写controller进行测试

@RestController
@Slf4j
@RequestMapping("/nacos/consumer")
public class NacosConsumerController {

    @Resource
    private NacosPaymentService nacosPaymentService;

    @GetMapping("/echo/{id}")
    public String echo(@PathVariable("id") String id) throws IllegalAccessException {
        log.info("******************输出:" + id);
        return nacosPaymentService.echo(id);
    }

}

OpenFeign超时控制

OpenFeign调用接口,默认超时时间为1S。
我们修改一下nacos-provider-payment服务,让放服务暂停2s,然后查看一下接口调用。

 @GetMapping(value = "/echo/{string}")
    public String echo(@PathVariable("string") String string) {
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "Hello Nacos Discovery " + string+"\t当前服务端口:"+serverPort;
    }

但是有时候我们业务接口可能需要处理的时间较长,那么我们可以配置接口调用的超时时间。
我们可以在配置文件中增加以下内容

#设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
  #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
  ReadTimeout: 5000
  #指的是建立连接后从服务器读取到可用资源所用的时间
  ConnectTimeout: 5000

我们再次测试接口,可以发现接口可以正常调用。

OpenFeign日志打印功能

增加日志bean

@Configuration
public class FeignConfig {
    @Bean
    Logger.Level feignLoggerLevel()
    {
        return Logger.Level.FULL;
    }
}

修改配置文件

YML文件里配置需要开启日志的Feign客户端

logging:
  level:
    net.xiangcaowuyu.springcloud.alibaba.service.NacosPaymentService: debug

测试

再次调用接口,可以看到输出的日志

负载均衡

如果我们同时启动了90019002端口,也就是说我们针对服务提供者做了集群,那么我们多次调用服务提供者时,会发现系统会依次输出90019002端口。也就是说,OpenFeign自带了负债均衡功能,默认采用的时轮询算法。
我们修改一下默认的负债均衡算法,设置的简单一点,如果我们的请求包含name=zhangsan参数,就调用到9001端口,否则就调用9002端口。

实现IRule接口

public class CustomerBalancerRule implements IRule {

    private ILoadBalancer balancer = new BaseLoadBalancer();

    @Override
    public Server choose(Object object) {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        String name = request.getParameter("name");
        List<Server> servers = balancer.getAllServers();
        if ("zhangsan".equals(name)) {
            if (servers.stream().anyMatch(e -> e.getPort() == 9001)) {
                return servers.stream().filter(e -> e.getPort() == 9001).collect(Collectors.toList()).get(0);
            }
            return servers.get(0);
        }
        return servers.get(1);
    }

    @Override
    public void setLoadBalancer(ILoadBalancer iLoadBalancer) {
        this.balancer = iLoadBalancer;
    }

    @Override
    public ILoadBalancer getLoadBalancer() {
        return this.balancer;
    }
}

配置服务提供者,调用负载均衡算法

#设置feign客户端超时时间(OpenFeign默认支持ribbon)
nacos-provider-payment:
  ribbon:
    #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
    ReadTimeout: 5000
    #指的是建立连接后从服务器读取到可用资源所用的时间
    ConnectTimeout: 5000
    NFLoadBalancerRuleClassName: net.xiangcaowuyu.springcloud.alibaba.config.CustomerBalancerRule
Spring CloudSpring BootFeignNacosOpenFeign
朗读
赞(0)
赞赏
感谢您的支持,我会继续努力哒!
版权属于:

香草物语

本文链接:

https://www.xiangcaowuyu.net/java/spring-cloud-uses-openfeign-to-call-the-nacos-service-provider.html(转载时请注明本文出处及文章链接)

评论 (0)