文章目录
引入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的流程:
- Order -->创建了订单数据
- Storage --> 扣减库存
- Account -->扣减账户,在调用Order 修改订单的状态,形成闭环,完成订单。
在持久层我使用的是JPA,自定义的增删改语句需要加上@Modifying
注解,并且在业务层需要加上声明式事务@Transactional
,这样就导致了在第一步的时候创建订单数据,因为事务此时还未提交,MySQL已经行锁
,在第三步的时候来进行修改这个订单数据的状态时候就无法修改,导致Feign调用超时。
服务注册到Nacos读取错误的配置文件
启动当前 Storage
服务,控制台日志显示读取的是其他服务的配置文件
Nacos配置中心一直不停的在拉取配置文件
如何解决后台日志显示Nacos客户端不断重复拉取配置的问题
原因:
因为使用的Nacos 1.2.1版本有一个已知的MD5问题,对同一个配置文件,Nacos客户端和Nacos服务端计算出的MD5值(校验和)不一致,会导致Nacos客户端认为该配置在Nacos服务端有更新,导致Nacos客户端不断从Nacos服务端拉取配置。
解决办法:
-
重新修改保存下配置文件:
在Nacos控制台上,修改配置文件(比如加一些不会影响格式的空格),再保存。这时Nacos客户端会重新拉取配置,并计算MD5值,只要计算出的MD5值不以0开头,就不会触发Nacos的MD5 bug。 -
升级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
- 可能是由于没有启动
seata-server
服务。 - 修改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