搭建SpringCloudAlibaba微服务时遇到的Nocos、Feign注入、Seata的各种问题

引入Fegin然后service接口注入失败

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2021-07-02 09:35:54.238 ERROR 6608 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Field storageService in com.lsh.storage.controller.StorageController required a bean of type 'com.lsh.storage.service.StorageService' that could not be found.

The injection point has the following annotations:
	- @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'com.lsh.storage.service.StorageService' in your configuration.


Process finished with exit code 1

在这里插入图片描述

解决办法:
在业务层接口实现类上注入:
在这里插入图片描述
在这里插入图片描述

在Controller中注入成功:
在这里插入图片描述

Feign 接口注入失败

在这里插入图片描述
解决办法:
需要在启动类上加上@EnableFeignClients注解
但是由于我的Feign调用接口是在其他服务,所以使用basePackages属性是无法扫描到Feign的接口类的,需要clients属性来指定Feign接口类,

在这里插入图片描述
注入成功:
在这里插入图片描述

Feign和SpringCloud版本冲突问题

Caused by: java.lang.AbstractMethodError: com.alibaba.cloud.sentinel.feign.SentinelContractHolder.parseAndValidateMetadata(Ljava/lang/Class;)Ljava/util/List;
	at feign.ReflectiveFeign$ParseHandlersByName.apply(ReflectiveFeign.java:151) ~[feign-core-10.7.4.jar:na]
	at feign.ReflectiveFeign.newInstance(ReflectiveFeign.java:49) ~[feign-core-10.7.4.jar:na]
	at feign.Feign$Builder.target(Feign.java:252) ~[feign-core-10.7.4.jar:na]
	at org.springframework.cloud.openfeign.HystrixTargeter.target(HystrixTargeter.java:38) ~[spring-cloud-openfeign-core-2.2.2.RELEASE.jar:2.2.2.RELEASE]
	at org.springframework.cloud.openfeign.FeignClientFactoryBean.loadBalance(FeignClientFactoryBean.java:253) ~[spring-cloud-openfeign-core-2.2.2.RELEASE.jar:2.2.2.RELEASE]
	at org.springframework.cloud.openfeign.FeignClientFactoryBean.getTarget(FeignClientFactoryBean.java:282) ~[spring-cloud-openfeign-core-2.2.2.RELEASE.jar:2.2.2.RELEASE]
	at org.springframework.cloud.openfeign.FeignClientFactoryBean.getObject(FeignClientFactoryBean.java:262) ~[spring-cloud-openfeign-core-2.2.2.RELEASE.jar:2.2.2.RELEASE]
	at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:171) ~[spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE]
	... 43 common frames omitted

在这里插入图片描述
解决办法:

在2.2.0.RELEASE里有一行注释描述,接口方法名拼写错误,在2.2.2.RELEASE方法已修正了,即方法名发生了改变。
解决:
以下3中方式均可:
1.修改Spring Cloud版本,Hoxton.SR3改为Hoxton.RELEASE
2.在dependencyManagement中指定spring-cloud-openfeign-dependencies的版本为2.2.0.RELEASE
(注意:spring-cloud-openfeign-dependencies写在spring-cloud-dependencies前面,因为dependency前面的优先生效。)
3.在项目中相同包路径下新建SentinelContractHolder类,方法实现和spring-cloud-alibaba-sentinel相同,修改Contract接口为新版版本的方法名即可。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-openfeign-dependencies</artifactId>
            <version>2.2.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
 
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR3</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
 
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.2.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

spring-cloud-alibaba-sentinel和feign配合使用,启动报Caused by: java.lang.AbstractMethodError

Feign 服务调用超时接口无响应问题

在这里插入图片描述

这个原因非常的低级,但是困扰我的时间很长,在使用Feign的时候Order调用Account 服务一直超时,我以为是feign的问题,于是我又使用RestTemplate来调用,然后也报错了,原因是:
createOrder的流程:

  1. Order -->创建了订单数据
  2. Storage --> 扣减库存
  3. Account -->扣减账户,在调用Order 修改订单的状态,形成闭环,完成订单。

在持久层我使用的是JPA,自定义的增删改语句需要加上@Modifying注解,并且在业务层需要加上声明式事务@Transactional,这样就导致了在第一步的时候创建订单数据,因为事务此时还未提交,MySQL已经行锁,在第三步的时候来进行修改这个订单数据的状态时候就无法修改,导致Feign调用超时。

在这里插入图片描述

服务注册到Nacos读取错误的配置文件

启动当前 Storage 服务,控制台日志显示读取的是其他服务的配置文件

在这里插入图片描述

Nacos配置中心一直不停的在拉取配置文件

如何解决后台日志显示Nacos客户端不断重复拉取配置的问题
在这里插入图片描述
原因:
因为使用的Nacos 1.2.1版本有一个已知的MD5问题,对同一个配置文件,Nacos客户端和Nacos服务端计算出的MD5值(校验和)不一致,会导致Nacos客户端认为该配置在Nacos服务端有更新,导致Nacos客户端不断从Nacos服务端拉取配置。

解决办法:

  1. 重新修改保存下配置文件:
    在Nacos控制台上,修改配置文件(比如加一些不会影响格式的空格),再保存。这时Nacos客户端会重新拉取配置,并计算MD5值,只要计算出的MD5值不以0开头,就不会触发Nacos的MD5 bug。

  2. 升级Nacos版本:
    在Nacos GitHub上已经将1.2.1版本标注为“Not Suggest Have MD5 Problem“,因此可以将Nacos升级到高版本来解决。

Seata JPA和MyBatis的数据源代理

Seata 持久层使用JPA 的 数据源代理:

/**
 * @author :LiuShihao
 * @date :Created in 2021/7/2 9:16 上午
 * @desc :seata  JPA代理数据源 进行事务回滚
 */
@Configuration
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DruidDataSource druidDataSource() {
        return new DruidDataSource();
    }

    /**
     * 需要将 DataSourceProxy 设置为主数据源,否则事务无法回滚
     *
     * @param druidDataSource The DruidDataSource
     * @return The default datasource
     */
    @Primary
    @Bean("dataSource")
    public DataSource dataSource(DruidDataSource druidDataSource) {
        return new DataSourceProxy(druidDataSource);
    }
}

Seata 持久层使用MyBatis 的 数据源代理:

/**
 * MyBatis数据源代理
 * @author wangzhongxiang
 */
@Configuration
public class DataSourceConfiguration {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource druidDataSource(){
        DruidDataSource druidDataSource = new DruidDataSource();
        return druidDataSource;
    }

    @Primary
    @Bean("dataSource")
    public DataSourceProxy dataSource(DataSource druidDataSource){
        return new DataSourceProxy(druidDataSource);
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSourceProxy dataSourceProxy)throws Exception{
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSourceProxy);
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath*:/mapper/*.xml"));
        sqlSessionFactoryBean.setTransactionFactory(new SpringManagedTransactionFactory());
        return sqlSessionFactoryBean.getObject();
    }

}

Seata no available service ‘null’ found, please make sure registry config correct

客户端启动找不到seata-server服务:

no available service 'null' found, please make sure registry config correct

在这里插入图片描述

  1. 可能是由于没有启动seata-server服务。
  2. 修改conf/nacos-config.txt 配置

service.vgroup_mapping.${your-service-gruop}=default,中间的${your-service-gruop}为自己定义的服务组名称,服务中的application.properties文件里配置服务组名称。
demo中有两个服务,分别是storage-service和order-service,所以配置如下:

service.vgroup_mapping.storage-service-group=default
service.vgroup_mapping.order-service-group=default

注意这里,高版本中应该是vgroupMapping 同时后面的如: order-service-group 不能定义为 order_service_group。

几个重要的配置

每个应用的resource里需要配置一个registry.conf ,demo中与seata-server里的配置相同
application.propeties 的各个配置项,注意spring.cloud.alibaba.seata.tx-service-group 是服务组名称,与nacos-config.txt 配置的service.vgroup_mapping.${your-service-gruop}具有对应关系

https://github.com/seata/seata-samples/tree/master/springcloud-nacos-seata

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liu_Shihao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值