一、nacos下载
直接输入nacos.io,然后在官网点击版本号
点击Tags选择版本下载
二、nacos安装
解压后的目录结构:
显然bin里面就是一些执行程序,conf中就是一些配置文件。因为nacos运行时需要数据库来记录用户、权限、角色等信息的。因此在conf中nacos已经为我们写好了需要的库和表。那就先建立库表,看看conf中的文件:
很显然,application.properties就是程序的启动配置文件,显然我们有理由相信,nacos其实就是一个springboot形式的程序。因此我们可能好奇启动的jar在哪里。其实就在target目录中
言归正传,接下来我们创建nacos需要的库表,显然在conf目录中,nacos-mysql.sql就是nacos为我们提供好的mysql库的建表语句。我们直接在我们的库里执行就好,结果如下
到了这里当然还不能直接启动nacos,既然建了表,那么就需要mysql的连接信息。因此修改config目录下的application.properties文件的数据库连接信息。
下面就是启动的时候,由于我们这里的nacos是单机模式并非集群,因此我们再启动的时候需要加个参数 ./startup.sh -m standalone
,然后我们查看logs目录下的nacos.log,判断是否启动成功
然后直接访问IP+8848+/nacos可以看到管理界面
默认用户名密码:nacos/nacos
三、创建项目
项目规划为一个父项目,管理依赖,两个子项目实现我们的实例
spring-cloud-nacos的pom.xml文件配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>lwb-project</artifactId>
<groupId>com.lwb</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-cloud-nacos</artifactId>
<packaging>pom</packaging>
<version>1.0.0-SNAPSHOT</version>
<modules>
<module>nacos-provider</module>
<module>nacos-consumer</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<parent>
<!--版本判断 https://start.spring.io/actuator/info-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR12</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<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>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
因为在父项目中,已经引入了本次试验所需的全部依赖,因此在两个子项目中,不用在写依赖配置了nacos-provider
的pom.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring-cloud-nacos</artifactId>
<groupId>com.lwb</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>nacos-provider</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
nacos-consumer
的配置类似
1、服务端编写
nacos-provider作为服务提供者,内容结构如下:
主启动类NacosProviderApplication
的编写内容如下:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @author 隐市高手
* @date 2022/4/24 22:55
*/
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}
}
EchoController
的编写内容如下:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author 隐市高手
* @date 2022/4/24 23:58
*/
@RestController
public class EchoController {
@Value("${server.port}")
private Integer port;
@GetMapping(value = "/echo/port")
public String echo() {
return "Hello Nacos Discovery " + port;
}
}
配置文件application.yml
的配置内容如下:
spring:
application:
name: nacos-provider
cloud:
nacos:
discovery:
server-addr: 192.168.101.41:8848
application-provider8081.yml
配置内容如下:
server:
port: 8081
application-provider8082.yml
配置内容如下:
server:
port: 8082
2、解释下配置文件
熟悉springboot的都知道,springboot在启动的时候,可以指定启动按照那个配置文件来启动。
而在项目拥有默认配置文件application.properties的时候,这个配置文件依然生效,只是会用你指定的配置文件去覆盖默认的配置文件。当然,指定的配置文件中没有的配置项,就只能按照默认的配置内容来生效了。
因此在启动时候,我只需要指定不同的配置文件,就可以将两个相同的服务,不同的端口注册到nacos中。
由于在按照不同的端口(指定不同的配置文件)启动的时候,两次启动的服务名spring.application.name
是相同的,都叫nacos-provider
。因此nacos自然的将这两个服务作为同一个服务的两个节点。
这里不用多说也知道192.168.101.41:8848
是我们要注册的nacos地址吧。
3、启动服务
上面写好了,服务那么就启动吧。这里说下,由于这是同一份代码,我们需要将idea设置为允许多次启动。
启动时指定配置文件为provider8082
,那么启动的服务监听8082端口。再次启动的时候配置为provider8081
,启动的服务监听的端口是8081。这样就在一份代码的情况下启动了两个服务,且注册到nacos中
启动结果如下:
看看nacos中是否注册了我们的服务:
再点击详情进入看看:
至此服务注册到nacos中成功
四、客户端编写
客户端nacos-consumer
也建立在父项目spring-cloud-nacos
下,因此也不需要再重新导入别的依赖,pom.xml配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring-cloud-nacos</artifactId>
<groupId>com.lwb</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>nacos-consumer</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
项目结构如下:
application-consumer9081.yml
配置文件编写:
server:
port: 9081
spring:
application:
name: nacos-consumer
cloud:
nacos:
discovery:
server-addr: 192.168.101.41:8848
provider.server.url: http://nacos-provider
NacosConfig
编写如下:
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;
/**
* @author 隐市高手
* @date 2022/4/25 0:28
*/
@Configuration
public class NacosConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
这里一定要一个@LoadBalanced
注解,由于上面我们的服务端注册了两个节点到nacos中。这里自然是要搞一个负载均衡的。由于在导入spring-cloud-starter-alibaba-nacos-discovery
依赖的时候自动导入了ribbon
,因此天然支持了负载均衡。所以不加@LoadBalanced
注解,客户端不知道改以什么方式来访问两个节点,要报错。
EchoController
编写:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @author 隐市高手
* @date 2022/4/24 23:58
*/
@RestController
public class EchoController {
@Value("${provider.server.url}")
private String providerServerUrl;
@Autowired
private RestTemplate restTemplate;
@GetMapping(value = "/echo/port")
public String echo() {
return restTemplate.getForObject(providerServerUrl + "/echo/port", String.class);
}
}
NacosConsumerApplication
主应用程序编写:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @author 隐市高手
* @date 2022/4/24 22:55
*/
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}
}
然后启动:
访问客户端接口 http://localhost:9081/echo/port
看看能不能轮次获取到输出8081/8082
一直点击刷新,可以看到8081和8082轮次显示