nacos注册中心
springcloud中使用eureka作为注册中心相对来说功能单一,界面不友好,不方便查看和管理微服务,阿里巴巴提供了一个更好的注册和配置中心那就是nacos,不单单可以作为服务的注册中心,同时也提供服务配置,监控等功能,界面也更加人性化,用官方的说法就是 Nacos 致力于帮助您发现、配置和管理微服务 nacos官网地址
下载nacos
下载地址 https://github.com/alibaba/nacos/releases
下载后解压缩进入bin目录
启动nacos服务
Linux/Unix/Mac
启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:
bash startup.sh -m standalone
Windows
启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone
启动完成后,登陆页面:http://localhost:8848/nacos/,登陆用户nacos,登陆密码为nacos。
这样服务注册中心启动完成,接下来就是创建服务并向里面注册。
创建服务提供方
新建一个springboot项目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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.springcloud</groupId>
<artifactId>provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-boot.version>2.4.4</spring-boot.version>
<spring-cloud.version>2020.0.2</spring-cloud.version>
<spring-cloud-alibaba.version>2020.0.RC1</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- spring boot 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring cloud 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring cloud alibaba 依赖 -->
<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>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos 服务注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.properties 文件
server.port=8001
#服务名
spring.application.name=nacos-provider
#注册中心地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
启动类上增加注解 @EnableDiscoveryClient 表示向nacos中注册服务。
增加一个控制类HelloController,向外提供一个接口。
package com.springcloud.provider;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @program: provider
* @description:
* @author: Mr.Wang
* @create: 2021-06-17 16:36
**/
@RestController
public class HelloController {
@Value("${server.port}")
private String port;
@GetMapping("/hello")
public String hello() {
return "Hello Nacos Discovery " + this.port;
}
}
启动服务,访问接口 http://localhost:8001/hello,返回Hello Nacos Discovery 8001,表示该服务运行在端口8001上。
此时nacos的服务列表多了一个服务,说明该服务注册成功。
创建服务消费方
当服务完成注册后,其他服务如果要使用该服务提供的接口,则此时需要消费服务,每个服务都是可以相互之间调用的,所以服务可以是消费方同时也可以是服务提供方,服务消费依然使用 openfeign实现远程调用。
新建一个springboot项目consumer。
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.springcloud</groupId>
<artifactId>consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-boot.version>2.4.4</spring-boot.version>
<spring-cloud.version>2020.0.2</spring-cloud.version>
<spring-cloud-alibaba.version>2020.0.RC1</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- spring boot 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring cloud 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring cloud alibaba 依赖 -->
<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>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--服务注册与发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--服务的调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--调用服务实现负载均衡 不加无法启动-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
配置文件 application.properties
server.port=9001
#服务名
spring.application.name=nacos-consumer
#注册中心地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
启动类增加注解 @EnableDiscoveryClient 和 @EnableFeignClients,分别表示服务注册和服务调用
新建一个feign调用接口ProviderClient,该接口通过feign远程调用服务
package com.springcloud.consumer;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(value = "nacos-provider" )
public interface ProviderClient {
@GetMapping("/hello")
String hi();
}
再新建一个控制器ConsumerController,测试接口调用
package com.springcloud.consumer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @program: consumer
* @description:
* @author: Mr.Wang
* @create: 2021-06-17 16:49
**/
@RestController
public class ConsumerController {
@Autowired
ProviderClient providerClient;
@GetMapping("/hi-feign")
public String hiFeign(){
return providerClient.hi();
}
}
启动服务,此时nacos 服务列表多了一个名为nacos-consumer 的服务。
访问接口 http://localhost:9001/hi-feign,返回字符串Hello Nacos Discovery 8001,此则说明通过feign远程调用服务成功。
服务集群与负载均衡
修改项目provider 的端口为8002,再次启动,(需要先修改idea允许在多个端口运行),此时该服务运行在8001和8002两个和端口上,nacos服务名nacos-provider的服务显示有两个。
重新访问接口 http://localhost:9001/hi-feign 并不停刷新,接口交替返回字符串 Hello Nacos Discovery 8002和Hello Nacos Discovery 8001,说明此时实现了服务的负载均衡了。
项目下载地址
服务提供方:https://github.com/378526425/springcloud-provider.git
服务消费方:https://github.com/378526425/springcloud-consumer.git
评论区