文章目录
Nacos:Dynamic Naming and Configuration Service
Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
简单说就是注册中心 + 配置中心
Nacos = Eureka + Config +Bus
本文讲述注册中心,配置中心参考:配置中心
官方文档:Nacos discovery
官方示例:Nacos Discovery Example
Nacos(作为注册中心)
Nacos Discovery动态服务发现
了解一下 Spring Cloud 应用如何接入 Nacos Discovery
官方文档
pom.xml 文件,引入 Nacos Discovery Starter。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
这样写
完整的pom依赖
<dependencies>
<!--SpringCloud ailibaba nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringBoot整合Web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--日常通用jar包配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!--spring-cloud-alibaba 版本统一管理-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
配置文件中配置 Nacos Server 地址
peoperties
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
yml
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #这里的IP写127.0.0.1和localhost都行
# 服务名
application:
name: gulimall-coupon
server:
port: 7000
使用 @EnableDiscoveryClient 注解开启服务注册与发现功能
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
@RestController
class EchoController {
@GetMapping(value = "/echo/{string}")
public String echo(@PathVariable String string) {
return string;
}
}
}
启动 Nacos Server
1.需要获取 Nacos Server
我这里下载了windows版的Nacos Server,安装包取官方文档找下载地址。
https://github.com/alibaba/nacos/releases
2.启动 Server
进入解压后文件夹或编译打包好的文件夹,找到如下相对文件夹 nacos/bin,并对照操作系统实际情况之下如下命令。
#Linux/Unix/Mac 操作系统,执行命令
sh startup.sh -m standalone
#Windows 操作系统,执行命令
cmd startup.cmd
这里遇到了问题1
验证
在浏览器输入此地址 http://127.0.0.1:8848/nacos/
或http://localhost:8848/nacos/ 这两个都可以
登录账号:nacos
密码:nacos
服务启动后在此可以查看服务
遇到的问题
问题1
nacos在windows上启动失败
解决:
cmd窗口单机启动
startup.cmd -m standalone
详情可参考:https://blog.csdn.net/m0_37607945/article/details/107339265
下面的内容来源于:尚硅谷周阳
Nacos支持负载均衡
因为自己集成了Ribbon
如:order83来消费payment服务
9001和9002都有这样的接口
package com.atguigu.springcloud.alibaba.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PaymentController
{
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id)
{
return "nacos registry, serverPort: "+ serverPort+"\t id"+id;
}
}
83的接口和配置
@LoadBalanced注解和RestTemplate配合
package com.atguigu.springcloud.alibaba.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@RestController
@Slf4j
public class OrderNacosController
{
@Resource
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serverURL;
@GetMapping(value = "/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id)
{
return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
}
}
package com.atguigu.springcloud.alibaba.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ApplicationContextConfig
{
@Bean
@LoadBalanced
public RestTemplate getRestTemplate()
{
return new RestTemplate();
}
}
验证
Nacos和其他注册中心的对比
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'