概述
最近在想做个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 。