一、Nacos 注册/配置中心
文章目录
- [一、Nacos 注册/配置中心](#一、Nacos 注册/配置中心)
-
- [1. 服务注册](#1. 服务注册)
- [2. 服务发现](#2. 服务发现)
- [3. 远程调用](#3. 远程调用)
- [4. 负载均衡](#4. 负载均衡)
1. 服务注册
- 引入依赖
xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 整合配置
properties
spring.application.name=service-order
server.port=8000
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
2. 服务发现
- 开启服务发现
java
@EnableDiscoveryClient //开启服务发现功能
@SpringBootApplication
public class ProductMainApplication {
public static void main(String[] args) {
SpringApplication.run(ProductMainApplication.class, args);
}
}
- 测试服务发现
- 这里discoveryClient和nacosServiceDiscovery效果一样
java
@SpringBootTest
public class DiscoveryTest {
@Autowired
DiscoveryClient discoveryClient;
@Autowired
NacosServiceDiscovery nacosServiceDiscovery;
@Test
void discoveryClientTest(){
//获取所有服务
for (String service : discoveryClient.getServices()) {
System.out.println("service = " + service);
//获取ip+port
//获取所有实例
List<ServiceInstance> instances = discoveryClient.getInstances(service);
for (ServiceInstance instance : instances) {
System.out.println("ip; "+instance.getHost()+"; "+"port = " + instance.getPort());
}
}
}
@Test
void nacosServiceDiscoveryTest() throws NacosException {
for (String service : nacosServiceDiscovery.getServices()) {
System.out.println("service = " + service);
//获取ip+port
try {
List<ServiceInstance> instances = nacosServiceDiscovery.getInstances(service);
for (ServiceInstance instance : instances) {
System.out.println("ip; "+instance.getHost()+"; "+"port = " + instance.getPort());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
3. 远程调用
-
配置RestTemplate
- RestTemplate是Spring提供的组件,发送请求
java@Configuration public class ProductServiceConfig { @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } }
java
/**
* 远程查询商品信息
* @param productId
* @return
*/
private Product getProductFromRemote(Long productId){
//1. 获取商品服务所在的所有机器IP+port
List<ServiceInstance> instances = discoveryClient.getInstances("service-product");
ServiceInstance serviceInstance = instances.get(1);
//远程url
String url = "http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/product/"+productId;
log.info("url = " + url);
//给远程发送请求
Product product = restTemplate.getForObject(url, Product.class);
return product;
}
4. 负载均衡
- RestTemplate添加@LoadBalanced
java
@Configuration
public class ProductServiceConfig {
@Bean
@LoadBalanced public RestTemplate restTemplate(){
return new RestTemplate();
}
}
-
直接拼写
java/**
- 基于注解的负载均衡远程查询商品信息
- @param productId
- @return
*/
private Product getProductFromRemoteWithLoadBalancerAnnotation(Long productId){
// 进阶 3 :基于注解的负载均衡
String url = "http://service-product/product/"+productId;
//给远程发送请求 service-product 会被动态替换
Product product = restTemplate.getForObject(url, Product.class);
return product;
}