什么是nacos( Dynamic Naming and Configuration Service)?
Nacos是阿里巴巴的产品,是SpringCloud中的一个组件。相比Eureka功能更加丰富,社区活跃度高,Nacos替代Eureka做服务注册中心。
服务注册到Nacos
首先要有我们提供服务(提供者)注册到我们的nacos注册中心,然后由消费者去服务中心调用我们服务,
我们整体的操作就是在父工程pom.xml中添加需要的依赖,其次就是一套小连招:
创建一个org.apache.maven.archetypes:maven-archetype-quickstart新模块-->在它的pom.xml添加nacos管理依赖以及其他需要-->在resources中书写application.yml文件配置端口、nacos地址等等-->编写启动类和controller业务逻辑-->启动微服务进行测试
开始
1.首先在父工程里面引入依赖:
<!--Spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
2.在子模块pom.xml里面引入依赖
<!-- SpringCloud alibaba nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3.配置nacos地址:
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
4.启动微服务,登录nacos管理页面,查看微服务信息
5.其他子模块也是同样的操作:
在pom.xml中添加依赖:
<!-- SpringCloud alibaba nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置nacos地址:
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
启动服务,登录nacos管理页面
Nacos实现服务间的负载均衡
Nacos为啥支持负载均衡?
@Configuration
public class ApplicationConfig {
@Bean
@LoadBalanced//开启负载均衡的注解
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
这里调用服务nacos-payment-provider
@Controller
@Slf4j
public class OrderNacosController {
@Resource
private RestTemplate resetTemplate;
@Value("${service-url.nacos-user-service}")
private String serverURL;
@GetMapping(value = "/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id")Long id){
return resetTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
}
}
配置文件application.yml
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
service-url:
nacos-user-service: http://nacos-payment-provider
Nacos控制台上配置服务权重
Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。
在Nacos控制台,找到提供者服务的实例列表,点击编辑,即可修改权重:
注意Nacos默认是轮询。此时在控制台上修改服务的权重是无效的,仍然是轮询。
要进行手动修改权重还需要在启动类添加
@Bean
@Scope(value = "prototype")
public IRule loadBalanceRule() {
return new NacosRule();
}
这样我们在nacos控制台上面修改才是有效的
这里端口9002--权重15,端口9001--端口1,权重越大访问频率越高。
记录测试Nacos注册中心遇到的bug
There was an unexpected error (type=Internal Server Error, status=500).
404 : [{"timestamp":"2023-10-23T11:06:28.126+0000","status":404,"error":"Not Found","message":"No message available","path":"/
解决方案:查看代码中路径是否正确以及是否将符号写错(绝对是)
com.alibaba.nacos.api.exception.NacosException: java.lang.reflect.InvocationTargetException
Caused by: java.lang.reflect.InvocationTargetException: null
Caused by: com.alibaba.nacos.api.exception.NacosException: endpoint is blank
解决方案:
查看maven依赖的jar 是由于依赖引入了spring-cloud-alibaba-nacos-config(nacos作为配置中心)
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-config</artifactId>
</dependency>
而配置文件没有配置导致,源代码为判断了 serverAddrStr为空,然后endpoint 为空 所以抛出了异常,所以1.将依赖删掉 (我用的)2.创建文件bootstrap.yml 添加以下配置地址为 nacos地址
spring:
cloud:
nacos:
config:
server-addr: localhost:8848
Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long'; nested exception is java.lang.NumberFormatException
解决方案:这个是请求路径出错
This application has no explicit mapping for /error, so you are seeing this as a fallback.
这个大致意思:这个应用没有明确的映射/错误,所以你才会看到这样一个返回结果
解决方案:我的是将注解@Controller改为@RestController
@RestController 是 @Controller 和 @ResponseBody 两个注解的结合体。若需要对Controller的方法进行序列化,我们需要在返回值上使用@ResponseBody
我看网上的一些错误猜测是1.Application启动类的位置不对,2.在springboot的配置文件:application.yml或application.properties中关于视图解析器的配置问题(没遇到过),3.控制器的URL路径书写问题