springboot整合openfeign配置微信小程序登录,并解决超时问题

在使用springcloud作为技术栈的时候,在rpc通信方面,有很多框架选择,例如dubbo,openfeign等。

OpenFeign是一个声明式的web服务客户端,它使得编写Web服务客户端变得非常容易。它使用基于注解的方式来定义和实现Web服务客户端。OpenFeign将Web服务API的定义与客户端的实现分离开来,从而使得Web服务API的维护变得更加简单。OpenFeign内置了对负载均衡、服务发现和断路器等功能的支持,使得在微服务架构中使用OpenFeign更加便捷。

springboot整合openfeign

maven

<properties>
        <java.version>21</java.version>
        <spring-cloud.version>2022.0.0</spring-cloud.version>
        <spring-cloud-alibaba.version>2022.0.0.0</spring-cloud-alibaba.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-openfeign</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bootstrap</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-loadbalancer</artifactId>
    </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>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

 配置类

@Configuration
public class FeignConfig {

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

rpc类

@FeignClient(url = "https://api.weixin.qq.com", name = "wx")
public interface WxService {

    @GetMapping("/sns/jscode2session")
    String jscode2session(@RequestParam String appid, @RequestParam String secret, @RequestParam String js_code, @RequestParam String grant_type);

    @PostMapping("/wxa/business/getuserphonenumber")
    WxResponse getuserphonenumber(@RequestBody WxRequest wxRequest, @RequestParam String access_token);

    @GetMapping("/cgi-bin/token")
    TokenResponse token(@RequestParam String grant_type, @RequestParam String appid, @RequestParam String secret);
}

dto类 

public record TokenResponse(String access_token, Integer expires_in) {
}
public record WxResponse(
        String openid,
        String session_key,
        String unionid,
        int errcode,
        String errmsg
) {

}

启动类

@SpringBootApplication
@EnableFeignClients
public class PlatformApplication {

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

}

测试类 

@Test
void testCode() {

    TokenResponse token = wxService.token("client_credential", "wxxxxxxxxx", "xxxxxxxxxx");
    System.out.println(token);
    var wxResponse = wxService.getuserphonenumber(new WxRequest("xxxxxxxxxxxxxxxxxxxxxxx"), token.access_token());
    System.out.println(wxResponse);
}

网络环境不好造成的超时问题

解决方案,一般遇到openfeign调用时超时有两种情况,一种是调用三方服务,一种是自己的服务,解决方案和思路也有差距

三方服务 

三方服务的特点是自己只作为调用方无法控制被调用的代码,而且也无法确定对方的网络以及代码执行情况

可以通过添加超时时间 

在配置文件中添加

feign:
  client:
    config:
      default:
        connectTimeout: 1500
        readTimeout: 1500

自己服务 

超时的原因可能时因为服务不稳定,可以采取重试策略

由于openfeign是默认不支持重试的,需要添加添加配置类,具体的时间需要根据实际情况填写,毕竟内网请求太久多半是服务架构不合理

@Configuration
public class FeignConfigure {
    
    @Bean
    public Retryer feignRetryer(){
        Retryer retryer = new Retryer.Default(100, 1000, 2);
        return retryer;
    }
}

 优化下又服务

找到超时的原因,可能是数据库查询没走索引,可能是大文件读写等问题,需要优化代码逻辑

!!!!内网不建议配置超时时间 

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值