spring/spring boot/spring cloud开发总结

时间:2023-03-09 20:44:41
spring/spring boot/spring  cloud开发总结

背景

       针对RPC远程调用,都在使用dubbo、dubbox等,我们也是如此。由于社区暂停维护、应对未来发展,我们准备尝试新技术(或许这时候也不算什么新技术了吧),选择使用了spring cloud架构。在此期间使用spring boot项目尝试开发,结果良好。所以想重构原spring项目至spring cloud一步一步进行,因此开发中会出现各种问题。

 问题

问题总是伴随着开发一步一步显露出来,遇到问题总要去解决:

spring cloud相关问题:

1.跨系统调用,传参对象接收不到问题

解决:服务方在对象参数前@RequestBody即可(ps:public void saveUser(@RequestBody User user)),数据存在报文体中。

2.系统间重试问题,会多次调用是正常业务数据出现重复,造成垃圾数据

解决分为2步且所有都在调用方配置,第一步新增类:

return中是参照feign.Retryer,至于方法名字任意。

@Configuration
public class FeignConfig {
@Bean
public Retryer feignRetryer() {
return new Retryer.Default(100, SECONDS.toMillis(1), 0);
}
}

  第二步:

  # Max number of next servers to retry (excluding the first server)

        sample-client.ribbon.MaxAutoRetriesNextServer=1对于集群服务会随机选择下一个服务,有可能还是选择访问自己。不是集群设置为1会访问自己会造成2次访问。

  sample-client 对于多个服务端,sample-client可以删掉。

查看配置发现,针对配置部分请点击这里

    # Max number of retries on the same server (excluding the first try)
    sample-client.ribbon.MaxAutoRetries=1  发现没用

    3.部署服务器,注册中心服务均存在,但是无法访问获取数据,报服务拒绝连接

解决:其实这算是个注意点,平时开发都是SpringApplication启动项目,打包部署服务时tomcat端口与server.port(spring boot)配置不一致造成。猜测spring cloud访问从注册中心获取主机与端口,根据主机和端口访问服务但是服务tomcat设置端口与配置不一致,造成问题。

spring boot相关问题:

1.项目使用SpringApplication启动正常,但是访问不了页面

解决:@ComponentScan只扫描当前程序所在包结构(包含子包)中声明

      | - src
      | | - main
      | | | - java
      | | | | - com
      | | | | | - controller/service/dao
      | | | | - SpringApplication.java

2.请求url响应问题,不同后缀响应不同

解决:该场景是因为spring boot有多个视图解析器,ajax请求可以直接使用a/b,页面a/b.htm

spring相关问题:

1.spring调用spring cloud项目问题

解决:使用HttpClient设置请求头Content-Type:application/json访问spring cloud对外系统(gateway)即可,至于内网外网访问随意

异常问题:

spring cloud有Hystrix断路由,虽然好处多多,但是访问每个接口都要相应断路由接口,如果处理逻辑有区别还好,没有区别我就不说了。由于我们是统一返回,所以针对出现问题使用全局异常拦截记录日志返回失败,这有个缺点是访问通异常可以处理,至于超时这些没有访问通就要捕获。

讨论

      学艺不精,有些都是似懂非懂,希望大神能指点指点。其中有点疑惑,spring访问spring  cloud最后都打成war包部署发布,个人觉得spring应该也可以注册到注册中心,希望知道的可以分享。