使用nacos配置中心功能实现服务端心跳上传和客户端负载均衡访问
- nacos下载及启动
- 服务端实现
-
- 服务端目录结构
- pom.xml关键部分
- bootstrap.yml
- application.yml
- com.xxx.nacosproductservice包
- com.xxx.nacosproductservice.service
- com.xxx.nacosproductservice.service.impl
- com.xxx.nacosproductservice.domain
- com.xxx.nacosproductservice.controller
- com.xxx.nacosproductservice.config
- com.xxx.nacosproductservice.beat
- 启动实例
- 解释说明
- 客户端实现
本文仅作练习与理解注册中心之用,实际开发请勿参考。
nacos下载及启动
nacos下载
- https://github.com/alibaba/nacos/releases/tag/1.3.2下载zip文件并解压;
- (单机版运行)命令框进入解压的目录下的bin目录下,输入命令运行;
cd C:\Program Files\nacos\bin
start.cmd -m standalone
- 显示运行界面;
- 运行后登录网址,打开nacos管理界面,如图;
- 配置管理中的配置列表可以对配置进行集中管理;服务管理功能当服务端启动时,如果使用了nacos的服务发现则会将实例显示在其中;本项目没有进行分组和命名空间的管理,使用了默认分组“DEFAULT_GROUP”;
- 本项目实现的是,服务端通过将心跳发送到配置中心进行保存,并定时更新实现心跳机制;每个实例会在服务列表进行注册(写入),并定时更新心跳;客户端会访问配置中心获取服务端实例,并获取每个服务端实例的心跳,判断实例是否在线,并实现了简单的负载均衡功能,实现客户端对多实例服务的负载均衡的访问。
服务端实现
服务端目录结构
pom.xml关键部分
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.26</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
bootstrap.yml
spring:
application:
name: nacos-product-service
cloud:
nacos:
discovery:
server-addr: localhost:8848 #nacos地址
config:
server-addr: localhost:8848 #nacos地址
file-extension: yaml
application.yml
spring:
profiles:
active: dev
server:
port: 8081
address: localhost
serverlist:
dataId: nacos-product-serverlist.yaml
serverheartbeat:
dataId: nacos-product-server.yaml
com.xxx.nacosproductservice包
NacosProductServiceApplication.java
import com.xxx.nacosproductservice.beat.HeartBeat;
import com.xxx.nacosproductservice.config.NacosFileOperater;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.Environment;
/**
* Create by zmzhu on 2020/8/17
*/
@SpringBootApplication
public class NacosProductServiceApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(NacosProductServiceApplication.class, args);
Environment environment = context.getBean(Environment.class);
String serverName = "server1";
String serveraddr = environment.getProperty("spring.cloud.nacos.config.server-addr");
String dataId = environment.getProperty("serverlist.dataId");
String group = "DEFAULT_GROUP";
String port = environment.getProperty("server.port");
NacosFileOperater operater = new NacosFileOperater(serverName, serveraddr, dataId, group);
operater.registConfig("http://localhost:" + port);
new Thread(new HeartBeat(operater, "http://localhost:", port)).start();
}
}
com.xxx.nacosproductservice.service
IProductService.java
import com.xxx.nacosproductservice.domain.Product;
import java.util.List;
/**
* Create by zmzhu on 2020/8/17
*/
public interface IProductService {
void create(Product product);
Product getProduct(Long id);
void update(Product product);
void delete(Long id);
Product getByProductname(String productname);
List<Product> getProductByIds(List<Long> ids);
}
com.xxx.nacosproductservice.service.impl
ProductService.java
import com.xxx.nacosproductservice.domain.Product;
import com.xxx.nacosproductservice.servcie.IProductService;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* Create by zmzhu on 2020/8/17
*/
@Service
public class ProductService implements IProductService {
private List<Product> productList;
@Override
public void create(Product product) {
productList.add(product);
}
@Override
public Product getProduct(Long id) {
List<Product> findProductList = productList.stream().filter(productItem -> productItem.getProductId().equals(id)).collect(Collectors.toList());Collectors.toList();
if(!CollectionUtils.isEmpty(findProductList)){
re