Spring Boot
版本:2.2.9.RELEASE
Spring Cloud
版本:Hoxton.SR6
Spring Cloud Alibaba
版本:2.2.1.RELEASE
Nacos
版本:1.3.1
参考 docker安装Nacos 启动一个单机版的Nacos
服务。
创建一个名为nacos-discovery-server
的Spring Cloud
项目,向Nacos
注册自己并提供服务。
引入spring-cloud-starter-alibaba-nacos-discovery
依赖。
<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.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.2.9.RELEASEversion>
<relativePath/>
parent>
<groupId>com.taogroupId>
<artifactId>nacos-discovery-serverartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>nacos-discovery-servername>
<description>Demo project for Spring Bootdescription>
<properties>
<java.version>1.8java.version>
<spring-cloud.version>Hoxton.SR6spring-cloud.version>
<spring-cloud-alibaba.version>2.2.1.RELEASEspring-cloud-alibaba.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>${spring-cloud-alibaba.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
project>
首先在启动类上面使用@EnableDiscoveryClient
开启服务注册:
@EnableDiscoveryClient
@SpringBootApplication
public class NacosDiscoveryServerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosDiscoveryServerApplication.class, args);
}
}
然后在application.properties
配置文件中配置主要的服务信息:
# 服务名、端口、上下文
spring.application.name=discoveryServer
server.port=8001
server.servlet.context-path=/ds
# nacos服务器的地址
spring.cloud.nacos.discovery.server-addr=192.168.225.128:8848
配置说明如下:
spring.application.name
配置类服务的名称为discoveryServer
。server.port
配置了服务的端口。server.servlet.context-path
配置了服务的上下文。spring.cloud.nacos.discovery.server-addr
配置了Nacos
服务的ip
和port
,根据这项配置就能将当前服务注册到Nacos
服务上面。定义一个简单的http
服务。
@RestController
public class MainController {
@Value("${server.port}")
private int port;
@GetMapping("/hello")
public String hello() {
return String.format("hello, I am discoveryServer, port is [%d]", port);
}
}
启动discoveryServer
服务,登录Nacos
控制台页面查看服务注册信息。
可以看到,discoveryServer
服务已经注册到Nacos
上面了。
创建一个名为nacos-discovery-client
的Spring Cloud
项目,作为服务消费者,消费discoveryServer
提供的服务。
同样,引入spring-cloud-starter-alibaba-nacos-discovery
依赖。
<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.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.2.9.RELEASEversion>
<relativePath/>
parent>
<groupId>com.taogroupId>
<artifactId>nacos-discovery-clientartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>nacos-discovery-clientname>
<description>Demo project for Spring Bootdescription>
<properties>
<java.version>1.8java.version>
<spring-cloud.version>Hoxton.SR6spring-cloud.version>
<spring-cloud-alibaba.version>2.2.1.RELEASEspring-cloud-alibaba.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>${spring-cloud-alibaba.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-loadbalancerartifactId>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
project>
首先在启动类上面使用@EnableDiscoveryClient
开启服务注册:
@EnableDiscoveryClient
@SpringBootApplication
public class NacosDiscoveryClientApplication {
public static void main(String[] args) {
SpringApplication.run(NacosDiscoveryClientApplication.class, args);
}
}
然后在application.properties
配置文件中配置主要的服务信息:
# 服务名、端口、上下文
spring.application.name=discoveryClient
server.servlet.context-path=/dc
server.port=8080
# nacos服务器的地址
spring.cloud.nacos.discovery.server-addr=192.168.225.128:8848
# 不使用RibbonLoadBalancerClient,改用BlockingLoadBalancerClient
spring.cloud.loadbalancer.ribbon.enabled=false
按照官方说明,对于客户端负载均衡,由于
Ribbon
已经处于维护阶段,官方建议通过BlockingLoadBalancerClient
这个官方实现去替换RibbonLoadBalancerClient
实现。如果要使用
BlockingLoadBalancerClient
,首先需要引入org.springframework.cloud:spring-cloud-starter-loadbalancer
依赖,然后在配置文件中添加spring.cloud.loadbalancer.ribbon.enabled=false
配置来禁用RibbonLoadBalancerClient
。如果不禁用,官方为了向后兼容,会优先使用RibbonLoadBalancerClient
。
可以创建一个http
服务,收到请求后将调用discoveryServer
的服务,如下:
@RestController
public class MainController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/testHello")
public String testHello() {
String response = restTemplate.getForObject("http://discoveryServer/ds/hello", String.class);
return String.format("Request forward to discoveryServer, response is [%s]", response);
}
}
这里可以简单的使用RestTemplate
来请求discoveryServer
,当然也可以用feign
。
上边的代码中,我们并没有直接通过discoveryServer
的ip
和port
去请求它的接口,而是直接通过服务名去请求。
当然,RestTemplate
的配置如下:
@Configuration
public class MainConfig {
@Bean("restTemplate")
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
这里使用了@LoadBalanced
实现了客户端的负载均衡。
在真正调用的时候,
Spring Cloud
会将请求拦截下来,然后通过负载均衡器选出节点,并替换服务名部分为具体的ip
和port
,从而实现基于服务名的负载均衡调用。
启动nacos-discovery-client
服务,查看Nacos
上面的注册信息:
可以看到,discoveryClient
服务也已经注册到Nacos
上面了。
通过请求discoveryClient
服务的/testHello
接口,可以验证discoveryServer
服务是否能够被discoveryClient
服务发现。
请求在浏览器中输入请求的url
:
http://localhost:8080/dc/testHello
通过输出的响应结果可以看出,discoveryClient
确实能够发现discoveryServer
服务,并能够成功调用http://discoveryServer/ds/hello
请求,得到响应结果。