最近的开发工作中,遇到了一个让我感到困惑的问题。当我尝试使用Nacos注册中心和Sentinel流控组件,以及启用Feign中的Sentinel支持时,我的服务无法正常运行,而是抛出了一个错误。通过我的学习和研究,我成功解决了这个问题。现在就和大家分享一下我的经验,并提供相应的程序代码。
首先来看一下我在用于配置Feign的应用程序.properties文件中做了哪些修改:
# 启用Sentinel支持
feign.sentinel.enabled=true
上述配置的目的是启用Feign中的Sentinel支持,以确保我们的服务能够与Sentinel进行交互。
接下来,让我们看一下我在使用Nacos作为注册中心时的配置。
在pom.xml文件中,添加Nacos和Sentinel的依赖:
<dependencies>
<!-- Nacos 客户端依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Sentinel 客户端依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
</dependencies>
接下来,我们需要在application.properties文件中配置Nacos的相关信息:
# Nacos配置
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=your-service-name
spring.cloud.nacos.discovery.namespace=
spring.cloud.nacos.discovery.group=DEFAULT_GROUP
此处需要注意的是,spring.application.name
属性应设置为你自己的服务名称。
现在,让我们来看一下在使用Nacos和Sentinel的同时启动服务时可能遇到的报错现象。
当我们尝试启动服务时,可能会收到类似以下的错误信息:
NoClassDefFoundError: com/alibaba/csp/sentinel/servlet/ServletFilter
这个错误是由于没有正确加载Sentinel依赖导致的。要解决这个问题,我们需要进行一些额外的配置。
在我们的项目中,创建一个ServletInit
类,实现ServletContextInitializer
接口,并在其中添加以下代码:
@Configuration
public class ServletInit implements ServletContextInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
// 注册 Sentinel 监听器
servletContext.addListener(new com.alibaba.csp.sentinel.adapter.servlet.listener.WebAppInitializer());
// 注册 Sentinel 过滤器
FilterRegistration.Dynamic filterRegistration = servletContext.addFilter("SentinelFilter",
new com.alibaba.csp.sentinel.adapter.servlet.CommonFilter());
filterRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
}
}
这些代码会在应用程序启动时注册Sentinel的监听器和过滤器,确保Sentinel能够正确工作。
现在,可以重新启动我们的服务,并且不再遇到上述错误。
综上所述,通过正确配置Nacos和Sentinel,并进行必要的初始化操作,成功解决了使用Nacos和Sentinel、启用Feign中的Sentinel支持时遇到的问题。希望我的分享能帮助到你解决类似的问题。