一 nacos
1.1 nacos作用介绍
nacos是一个分布式的配置中心和注册发现中心。
nacos是 dynamic naming configuration service
nacos=config+bus 实现动态刷新;nacos=consul
1.2 各个注册中心对比
注册中心 | CAP模型 | 控制台管理 | 社区活跃度 |
Eureaka | Ap | 支持 | 低 |
zk | cp | 不支持 | 中 |
consul | cp | 支持 | 高 |
nacos | AP,和cp | 支持 | 高 |
二 Nacos的安装
2.1 nacos的安装搭建
1.本次安装版本为2.2.3,下载软件包,进行解压启动,输入命令
E:\nacos-server2.2.3\bin>startup.cmd -m standalone
2.截图
3.访问地址
三 服务端的注册到Nacos
3.1 流程说明以及注意事项
1.客户端:ms-alibaba-provider8081
2.服务端:ms-alibaba-provider9091
3.注意事项:请求服务端的地址 不能只写 服务名称:ms-alibaba-provider9091,否则请求不成功
需要改成如下:http://ms-alibaba-provider9091
3.2 客户端配置
1.pom
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.jurf.ms</groupId>
<artifactId>mscloud-demo-2024</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.jurf.ms.alibaba.consumer8081</groupId>
<artifactId>ms-alibaba-consumer-8081</artifactId>
<packaging>jar</packaging>
<name>ms-alibaba-consumer-8081</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- 引入自己定义的api通用包 -->
<!-- <dependency>-->
<!-- <groupId>com.jurf.ms.api</groupId>-->
<!-- <artifactId>ms-api-commons</artifactId>-->
<!-- <version>1.0-SNAPSHOT</version>-->
<!-- </dependency>-->
<!--openfeign-->
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-openfeign</artifactId>-->
<!-- </dependency>-->
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--loadbalancer-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<!--web + actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-actuator</artifactId>-->
<!-- </dependency>-->
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
2.application配置
server:
port: 8081
spring:
application:
name: ms-alibaba-consumer-8081
cloud:
nacos:
discovery:
server-addr: localhost:8848
#消费者将要去访问的微服务名称(nacos微服务提供者叫什么你写什么)
service-url:
nacos-user-service: http://ms-alibaba-provider9091
3.业务
a)controller
package com.jurf.ms.alibaba.consumer8081.controller;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @auther zzyy
* @create 2024-01-01 15:43
*/
@RestController
public class OrderNacosController
{
@Resource
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serverURL;
@GetMapping(value = "/consumer/pay/nacos/{id}")
public String paymentInfo(@PathVariable("id") Integer id)
{
System.out.println("进来了要。。。。。");
// String serverUrl="http://localhost:9091";
String result = restTemplate.getForObject(serverURL + "/pay/nacos/"+id, String.class);
return result+"\t"+" 我是OrderNacosController83调用者。。。。。。";
// return "\t"+" 我是OrderNacosController83调用者。。。。。。";
}
}
b)config
package com.jurf.ms.alibaba.consumer8081.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* @auther zzyy
* @create 2024-01-01 15:42
*/
@Configuration
public class RestTemplateConfig
{
@Bean
@LoadBalanced //赋予RestTemplate负载均衡的能力
public RestTemplate restTemplate()
{
return new RestTemplate();
}
}
4.启动类
package com.jurf.ms.alibaba.consumer8081;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* Hello world!
*
*/
@EnableDiscoveryClient
@SpringBootApplication
public class App8081
{
public static void main( String[] args )
{
SpringApplication.run(App8081.class,args);
System.out.println( "Hello World!" );
}
}
3.3 服务端
1.pom
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.jurf.ms</groupId>
<artifactId>mscloud-demo-2024</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.jurf.ms.alibaba.provider9091</groupId>
<artifactId>ms-alibaba-provider-9091</artifactId>
<packaging>jar</packaging>
<name>ms-alibaba-provider-9091</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--web + actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
2.application配置
server:
port: 9091
spring:
application:
name: ms-alibaba-provider9091
cloud:
nacos:
discovery:
server-addr: localhost:8848
3.业务
package com.jurf.ms.alibaba.provider9091.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
/**
* @auther zzyy
* @create 2024-01-01 15:31
*/
@RestController
public class PayAlibabaController
{
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/pay/nacos/{id}")
public String getPayInfo(@PathVariable("id") Integer id)
{
return "nacos registry, serverPort: "+ serverPort+"\t id"+id;
}
}
4.启动类
package com.jurf.ms.alibaba.provider9091;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* Hello world!
*
*/
@EnableDiscoveryClient
@SpringBootApplication
public class Nacos9091App
{
public static void main( String[] args )
{
SpringApplication.run(Nacos9091App.class,args);
System.out.println( "Hello World!" );
}
}
3.4 调试
1启动服务
2.调试:http://localhost:8081/consumer/pay/nacos/456
四 nacos的动态刷新
4.1 动态刷新配置逻辑
2.配置对应关系