发表于: 2020-08-06 23:28:59
1 2233
今天完成的事情
1. 完成了项目的改写
2. 修复了一些 bug
遇到的问题
1. feign 传递自定义实体类出错,服务端获取到的是空值
原因:
接口的定义中,post 方法的形参要加上注解
/**插入新用户信息*/
@PostMapping(value = "/user", consumes = "application/json")
boolean insertUser(@RequestBody User user);
2. 登录用户名中文乱码
原因:
要对 base64 解密的 byte[] 进行 utf-8 转码转换为字符串
// String info = new String(Base64.getUrlDecoder().decode(playload));
byte[] bytes = Base64.getUrlDecoder().decode(playload);
String info = new String(bytes, StandardCharsets.UTF_8);
注释的是原来乱码的写法。
这个问题查了很久,一直以为是没有配置好 spring boot 的过滤器,折腾了很久才定位到 JWT 载荷节码的这个部分。
3. 客户端只调用了一次发送邮件请求,但是服务端偶尔发送两封邮件,时间间隔几毫秒
没有定位到问题,目前怀疑是 Hystrix 配置的影响。
4. feign 接口的注解写到公共包之后客户端启动提示无法注入接口
解决的方法:
客户端 feign 启动注解添加参数指定接口位置
@EnableFeignClients(basePackages = {"cn.mogeek.ptteng.core.service"})
收获
1. feign 的使用
原来我的理解还是有点问题,现在大致的调用方式如下(以 banner 数据的获取为例)
公共组件包(定义接口):
@FeignClient(value = "ptteng-provider", configuration = FeignConfig.class)
public interface BannerService {
/**获取轮播图信息*/
@GetMapping(value = "/banner/list")
List<Banner> list();
}
服务端实现类:
@CacheConfig(cacheNames = "banner")
@RestController
public class BannerServiceImpl implements BannerService {
private static final Logger LOGGER = LogManager.getLogger(BannerServiceImpl.class);
@Autowired
private BannerMapper bannerMapper;
@Cacheable(key = "#root.method")
@Override
public List<Banner> list() {
LOGGER.info("[bannerList] 没有缓存,重读数据库");
List<Banner> banners = bannerMapper.selectByExample(new BannerExample());
return banners;
}
}
客户端调用:
客户端启动类注解(指定接口类的位置)
@EnableFeignClients(basePackages = {"cn.mogeek.ptteng.core.service"})
控制器直接调用,因为 feign 调用注解都在接口写好了
@Autowiredprivate BannerService bannerService;
@GetMapping("/home")
public ModelAndView home(ModelAndView modelAndView, @RequestParam(required = false) String token) throws IOException {
····
bannerService.list();
····
}
这样就非常清晰了,当然这只是最简单的情况,还有文件的传递(我没做)、自定义类的传递、多参数的传递,post 方法这些情况,注意一下接口的注解就好。
feign 这个东西还是很灵活的。
明天的计划
1. 完成深度思考
这几天做这个项目做的有点慢,今天本来预计提交任务九,但是 debug 了一天,到晚上 10点多才搞完。
评论