服务注册发现 & 配置中心 springcloud alibaba nacos

文章目录

  • [0100 系统环境](#0100 系统环境)
  • [0200 nacos安装](#0200 nacos安装)
    • [0201 下载](#0201 下载)
    • [0202 安装](#0202 安装)
  • [0300 工程说明](#0300 工程说明)
    • [0301 结构说明](#0301 结构说明)
    • [0302 运行效果](#0302 运行效果)
  • [0400 代码说明](#0400 代码说明)
    • [0401 服务提供者(Provider Service)](#0401 服务提供者(Provider Service))
    • [0402 服务消费者(Consumer Service)](#0402 服务消费者(Consumer Service))
    • [服务提供者SDK(Provider Service sdk)](#服务提供者SDK(Provider Service sdk))
  • [0500 负载均衡](#0500 负载均衡)
  • [0600 源码地址](#0600 源码地址)

0100 系统环境

base 复制代码
	JDK: jdk-20.0.2
	spring cloud alibaba: 2022.0.0.0
	spring cloud: 2022.0.4
	spring boot: 3.1.5
	nacos: 2.3.0-BETA

0200 nacos安装

0201 下载

官网:https://nacos.io/zh-cn/index.html

github:https://github.com/alibaba/nacos

当前最新版本:https://github.com/alibaba/nacos/releases/download/2.3.0-BETA/nacos-server-2.3.0-BETA.zip

0202 安装

  • 导入数据库脚本:./conf/mysql-schema.sql,如下:
sql 复制代码
mysql> show tables;
+----------------------+
| Tables_in_nacos      |
+----------------------+
| config_info          |
| config_info_aggr     |
| config_info_beta     |
| config_info_tag      |
| config_tags_relation |
| group_capacity       |
| his_config_info      |
| permissions          |
| roles                |
| tenant_capacity      |
| tenant_info          |
| users                |
+----------------------+
12 rows in set (0.00 sec)
  • 配置数据库
    修改./conf/application.properties
shell 复制代码
#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
spring.datasource.platform=mysql
spring.sql.init.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123456

### Connection pool configuration: hikariCP
db.pool.config.connectionTimeout=30000
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2
  • 启动服务
shell 复制代码
# 默认是集群模式
./startup.sh -m standalone

访问地址:http://192.168.1.200:8848/nacos
先做个基础设置

创建namespace:prod
创建个配置文件

0300 工程说明

0301 结构说明

shell 复制代码
demo-springcloud-alibaba-nacos (父工程)
├── demo-springcloud-alibaba-nacos-consumer (服务消费者,端口:8000,未使用配置中心)
├── demo-springcloud-alibaba-nacos-provider1 (服务提供者,端口:9001,已使用配置中心)
├── demo-springcloud-alibaba-nacos-provider2 (服务提供者,端口:9002,已使用配置中心)
└── demo-springcloud-alibaba-nacos-provider-sdk(服务端,SDK)

注意: 示例中,为了方便看效果,服务提供者分别提供两个工程,内部代码都一样,只是端口不同。

0302 运行效果

访问这个地址,将随机返回结果:http://localhost:8000/echo2/a

base 复制代码
我的端口是:9001, 配置中心的值是:abc, 传过来的值是:a
base 复制代码
我的端口是:9002, 配置中心的值是:abc, 传过来的值是:a

修改配置中心配置项,可立即得到最新结果;

0400 代码说明

0401 服务提供者(Provider Service)

demo-springcloud-alibaba-nacos-provider1 ,端口:9001

关键依赖(pom.xml)

xml 复制代码
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

关键配置(application.properties)

shell 复制代码
spring.config.import=optional:nacos:demo-springcloud-alibaba-nacos-config

spring.application.name=demo-springcloud-alibaba-nacos-provider
spring.profiles.active=test

server.port=9001

spring.cloud.nacos.server-addr=192.168.1.200:8848
spring.cloud.nacos.discovery.server-addr=192.168.1.200:8848
spring.cloud.nacos.discovery.namespace=prod
spring.cloud.nacos.discovery.group=demo
spring.cloud.nacos.discovery.weight=5
spring.cloud.nacos.config.server-addr=192.168.1.200:8848
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.config.namespace=prod
spring.cloud.nacos.config.group=demo

management.endpoints.web.exposure.include=*

启动类:

java 复制代码
@SpringBootApplication
@EnableDiscoveryClient
public class SpringcloudAlibabaNacosProvider1 {

    public static void main(String[] args) {
        SpringApplication.run(SpringcloudAlibabaNacosProvider1.class, args);
    }
}

demo-springcloud-alibaba-nacos-provider1 ,端口:9002

demo-springcloud-alibaba-nacos-provider1代码完全一样,只是application.properties中的server.port=9002

yaml 复制代码
spring.application.name=demo-springcloud-alibaba-nacos-provider
spring.profiles.active=test

server.port=9002
....

0402 服务消费者(Consumer Service)

demo-springcloud-alibaba-nacos-consumer ,端口:8000

关键依赖(pom.xml)

xml 复制代码
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

关键配置(application.properties)

shell 复制代码
spring.application.name=demo-springcloud-alibaba-nacos-consumer
server.port=8000

spring.cloud.nacos.discovery.server-addr=192.168.1.200:8848
spring.cloud.nacos.discovery.namespace=prod
spring.cloud.nacos.discovery.group=demo
spring.cloud.loadbalancer.nacos.enabled=true

management.endpoints.web.exposure.include=*

启动类:

java 复制代码
@SpringBootApplication
@EnableDiscoveryClient
public class SpringcloudAlibabaNacosConsumer {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudNetflixEurekaConsumer.class, args);
    }
}

服务提供者SDK(Provider Service sdk)

实际工作中,该工程应该由服务提供者 开发团队开发,供服务消费者依赖调用,来实现远程调用。本实例使用openfeign。

关键依赖(pom.xml)

xml 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

关键代码(demo-springcloud-alibaba-nacos-provider-sdk工程ProviderService类):

java 复制代码
// 接口,无需手写实现类
@Component
@FeignClient(name = ProviderConstants.SERVICE_ID)
public interface ProviderService {

    @RequestMapping(value = "/echo/{str}")
    String echo(@RequestParam("str") String str);
}

服务提供者依赖后使用(demo-springcloud-alibaba-nacos-provider1工程)

服务消费者依赖后使用(demo-springcloud-alibaba-nacos-consumer工程)

java 复制代码
@Autowired
private ProviderService providerService;

@ResponseBody
@RequestMapping(value = "/echo2/{str}")
public String echo2(@PathVariable String str) {
    return providerService.test(name);
}

0500 负载均衡

客户端负载,按服务端权重负载:(demo-springcloud-alibaba-nacos-consumer工程)

java 复制代码
@Configuration(proxyBeanMethods = false)
public class CustomLoadBalancerConfig {

    @Resource
    private NacosDiscoveryProperties nacosDiscoveryProperties;

    @Bean
    public ReactorLoadBalancer<ServiceInstance> nacosLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {

        var name = ProviderConstants.SERVICE_ID;
        return new NacosLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name,
                nacosDiscoveryProperties);
    }
}

0600 源码地址

https://gitee.com/xiaojianhx/demo-springcloud-alibaba-nacos

相关推荐
爱海贼的无处不在20 分钟前
一个需求竟然要开14个会:程序员的日常到底有多“会”?
后端·程序员
IT_陈寒1 小时前
Java 性能优化:5个被低估的JVM参数让你的应用吞吐量提升50%
前端·人工智能·后端
南囝coding1 小时前
《独立开发者精选工具》第 018 期
前端·后端
绝无仅有2 小时前
数据库MySQL 面试之死锁与排查经验总结
后端·面试·github
用户384958730692 小时前
Spring Boot 集成 Redis 的完整流程
后端
昨日的风2 小时前
springboot 多数据源切换
后端
绝无仅有3 小时前
mysql性能优化实战与总结
后端·面试·github
用户8356290780513 小时前
从手动编辑到代码生成:Python 助你高效创建 Word 文档
后端·python
德育处主任3 小时前
玩转 Strands:AI Agent 开发,原来可以这么简单!
后端·aigc
Undoom3 小时前
大模型选型“炼狱”与终结:一份来自普通开发者的AI Ping深度评测报告
后端