pom依赖
<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>
<version>2.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
启动类
@SpringBootApplication
@EnableDiscoveryClient //开启服务发现功能
public class NacosProvider1Application {
public static void main(String[] args) {
SpringApplication.run(NacosProvider1Application.class, args);
}
}
就好了
提供一个服务
controller.DeptController
@RestController
@Slf4j
public class DeptController {
@Value("${server.port}")
private String serverPort;
@Value("${spring.application.name}")
private String name;
@GetMapping(value = "/dept/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id) {
return "<h2>我是服务提供方,我来提醒您,服务访问成功!</h2>服务名:"+ name +"<br /> 端口号: " + serverPort + "<br /> 传入的参数:" + id;
}
}
application.properties
# 应用名称
spring.application.name=nacos-provider1
#端口号
server.port=8001
#Nacos Server 的地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*
<!--SpringCloud ailibaba nacos discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<!--由于 Netflix Ribbon 进入停更维护阶段,因此新版本的 Nacos discovery 都已经移除了 Ribbon ,此时我们需要引入 loadbalancer 代替 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
applicaiton.yml
server:
port: 8002 #端口号
spring:
application:
name: nacos-consumer1 #服务名
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos server 的地址
#以下配置信息并不是默认配置,而是我们自定义的配置,目的是不在 Controller 内硬编码服务提供者的服务名
service-url:
nacos-user-service: http://nacos-provider1 #服务提供者的服务名
一个配置类读取 RestTemplate
@Configuration
public class MyConfig {
@Bean
@LoadBalanced //与 Ribbon 集成,并开启负载均衡功能
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
一个controller类来消费提供者的服务
@RestController
@Slf4j
public class ConsumerDoController {
@Resource
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serverURL; //服务提供者的服务名
@GetMapping("/consumer/dept/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id) {
return restTemplate.getForObject(serverURL + "/dept/nacos/" + id, String.class);
}
}
http://localhost:8002/consumer/dept/nacos/100
Nacos服务列表展示内容
Nacos下线一个服务
curl -X DELETE '127.0.0.1:8848/nacos/v1/ns/service?serviceName=nacos-consumer1'
这个订阅者列表不是指消费者列表,而是指主动向Nacos Server发起事件监听的订阅者,比如健康检查、服务变更等事件监听的订阅者,具体可查看NacosDiscoveryEndpoint.nacosDiscovery()方法中是通过EventDispatcher去获取订阅者列表和发布事件
nacos-provider1子项目打包(为了生成独立可以执行的jar文件,我们修改子项目pom.xml文件)
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>
com.javaer.nacosprovider1.NacosProvider1Application
</mainClass>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
<executions>
<execution>
<goals>
<!--可以把依赖的包都打包到生成的Jar包中-->
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
启动一个8004端口作为第二个提供者
java -jar nacos-provider1.jar --server.port=8004
系统有了2个服务提供者,这时候我们刷新http://localhost:8002/consumer/dept/nacos/100
发现有时候显示端口号为8004,有时候显示为8001
微服务后端自动集群了。一个服务者挂了,还有一个服务者提供服务,我建立10个服务提供方是否可以,可以啊。服务器多,用100个也成。
服务提供者
https://github.com/yuexiaosheng/javaer/tree/main/nacos-provider1
服务消费者
https://github.com/yuexiaosheng/javaer/tree/main/nacos-consumer1