Spring Cloud OpenFeign组件

概述

最近在想做个cloud项目,gitee上找了个模板项目,后端使用到 Nacos、Gateway、Security等技术,看到 OpenFeign 组件 实现服务之间的通信 用得很好,再次分享一下。

Feign

Feign是Netflix公司写的,是SpringCloud组件中的一个轻量级RESTful的HTTP服务客户端,是SpringCloud中的第一代负载均衡客户端。

  • Feign是一个声明式WebService客户端。
  • 使用Feign能让编写Web Service客户端更加简单。
  • 它的使用方法是定义一个服务接口然后在上面添加注解。
  • Feign也支持可拔插式的编码器和解码器。
    Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡

OpenFeign

Feign是在2019就已经不再更新了,通过maven网站就可以看出来,随之取代的是OpenFeign,从名字上就可以知道,它是Feign的升级版。
OpenFeign是SpringCloud自己研发的,在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。是SpringCloud中的第二代负载均衡客户端。

Feign依赖

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

OpenFeign 依赖

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

实践

需求

在这里插入图片描述

文件分布

在这里插入图片描述

SmsApi (PpenFeign 接口)

/**
 * 短信服务API
 *
 * @author lanys
 */
@FeignClient(name = ServerNames.MESSAGE_SERVER_NAME)
public interface SmsApi {
    
    

    /**
     * 发送短信
     *
     * @param mobile 手机号
     * @param params 参数
     * @return 是否发送成功
     */
    @PostMapping(value = "api/message/sms/send")
    Result<Boolean> send(@RequestParam("mobile") String mobile, @RequestParam("params") Map<String, String> params);

    /**
     * 发送短信
     *
     * @param mobile 手机号
     * @param key    参数KEY
     * @param value  参数Value
     * @return 是否发送成功
     */
    @PostMapping(value = "api/message/sms/sendCode")
    Result<Boolean> sendCode(@RequestParam("mobile") String mobile, @RequestParam("key") String key, @RequestParam("value") String value);

    /**
     * 效验短信验证码
     *
     * @param mobile 手机号
     * @param code   验证码
     * @return 是否效验成功
     */
    @PostMapping(value = "api/message/sms/verifyCode")
    Result<Boolean> verifyCode(@RequestParam("mobile") String mobile, @RequestParam("code") String code);
}

SmsApiImpl(短信模块服务)

@RestController
@AllArgsConstructor
public class SmsApiImpl implements SmsApi {
    
    
    private final SmsService smsService;
    private final SmsSendCache smsSendCache;

    @Override
    public Result<Boolean> send(String mobile, Map<String, String> params) {
    
    
        boolean flag = smsService.send(mobile, params);
        return Result.ok(flag);
    }

    @Override
    public Result<Boolean> sendCode(String mobile, String key, String value) {
    
    
        // 短信参数
        Map<String, String> params = new HashMap<>();
        params.put(key, value);

        // 发送短信
        boolean flag = smsService.send(mobile, params);
        if (flag) {
    
    
            smsSendCache.saveCode(mobile, value);
        }
        return Result.ok(flag);
    }

    @Override
    public Result<Boolean> verifyCode(String mobile, String code) {
    
    
        boolean flag = false;

        String value = smsSendCache.getCode(mobile);
        if (value != null) {
    
    
            // 删除短信验证码
            smsSendCache.deleteCode(mobile);

            // 效验
            flag = value.equalsIgnoreCase(code);
        }

        return Result.ok(flag);
    }
}

测试

@RestController
@Tag(name="新增模块演示")
@AllArgsConstructor
public class TestController {
    
    
    private final StorageApi storageApi;

    private final SmsApi smsApi;

    @GetMapping("/send")
    public Result<Boolean> send () {
    
    
        Result<Boolean> code = smsApi.sendCode("18376662074", "code", RandomUtil.randomNumbers(6));
        System.out.println("返回结果:"+code);
        return Result.ok(true);
    }

}

在这里插入图片描述
在这里插入图片描述

总结

目前展示的只是 OpenFeign 使用,短信发送代码(策略模式 + 模板模式)我并没有展示出来,使用目的已经达到,感兴趣的大佬,我可以提供项目地址git 。

猜你喜欢

转载自blog.csdn.net/qq_44697754/article/details/129715709