1 | SpringCloud:nacos从入门到出门

nacos可提供动态服务发现、服务配置、服务元数据及流量管理。nacos集群搭建下载nacos:https://github.com/alibaba/nacos/releases/download/1.2.0/nacos-server-1.2.0.zip解压修改startup.cmd中的MODE为c

nacos可提供动态服务发现、服务配置、服务元数据及流量管理。

nacos集群搭建

下载nacos:https://github.com/alibaba/nacos/releases/download/1.2.0/nacos-server-1.2.0.zip

解压

修改startup.cmd中的MODE为cluster,只要不为standalone就行。

复制bin/startup.cmd,分别为bin/startup-8858.cmd,bin/startup-8868,这样会得到3份启动脚本,然后在复制出来的脚本中,分别加入所需要绑定的端口,如下:

// bin/startup-8858.cmd
set "JAVA_OPT=%JAVA_OPT% -Dserver.port=8858"
// bin/startup-8868.cmd
set "JAVA_OPT=%JAVA_OPT% -Dserver.port=8868"

注意位置,放在读取默认配置代码的后面,会导致端口修改不生效。最保险的是放在这个变量最开始地方的前面。可参考下面的修改:

  1. 重命名cluster.conf.example为cluster.conf,然后加入其它实例信息:
192.168.137.1:8848
192.168.137.1:8858
192.168.137.1:8868
  1. 在docker环境中创建一个mysql容器,root密码为root,如下:
docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:5.7
  1. 登录进MySQL,新增一个nacos数据库,然后运行conf/nacos-mysql.sql,导入nacos需要的表结构:
  1. 修改application.properties中数据库相关的配置
  1. 依次点击startup.cmd、startup-8858.cmd、startup-8868.cmd
  1. 然后随便打开一个实例的url,这里选了8848的实例,如下:

后面还可以考虑做一个nginx,对三个nacos做一下负载均衡,docker运行指令如下:

docker run --name nginx -v /d/projects/nginx:/etc/nginx -p 80:80 -d nginx

nginx的配置信息如下:

user www-data;             ## 配置 worker 进程的用户和组
worker_processes auto;     ## 配置 worker 进程启动的数量,建议配置为 CPU 核心数
error_log logs/error.log;  ## 全局错误日志
pid /run/nginx.pid;        ## 设置记录主进程 ID 的文件
worker_rlimit_nofile 8192; ## 配置一个工作进程能够接受并发连接的最大数

events {
    
}

http{
    upstream nacos {
        server 192.168.137.1:8848;
        server 192.168.137.1:8858;
        server 192.168.137.1:8868;
    }

    server {
        listen 80;
        server_name  localhost;
        location /nacos/ {
            proxy_pass http://nacos/nacos/;
        }
    }
}

还试了一下,删掉leader,过段时间会重新选举出来新的leader。

如何在代码中使用nacos

还是继续分成两种类型,一种是配置相关,另一种是服务注册与发现。

配置信息

可通过web端访问localhost/nacos来进行管理,也可以通过命令行进行简单的查询、管理:

// 发布配置
curl -X POST "http://localhost/nacos/v1/cs/configs?dataId=module-01.yml&group=DEFAULT_GROUP&content=hellonacos"
// 获取配置
curl -X GET "http://localhost/nacos/v1/cs/configs?dataId=module-01.yml&group=DEFAULT_GROUP"

在代码中使用nacos的配置使用时,以Spring Cloud为例(也可参考官方文档demo):

①pom文件需要特别注意版本问题,用官方的实例都有问题,主要体现在配置发布了之后不能刷新

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-config -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        <version>2.2.0.RELEASE</version>
    </dependency>
</dependencies>

出问题的原因主要是版本不一致。主要是看Spring Boot的版本,这里的Spring Boot版本是v2.2.5.RELEASE,根据官网版本说明wiki可以看出:

所以这里选2.2.0.RELEASE版本的spring-cloud-starter-alibaba-nacos-config。按照官网example的例子,选0.2.1.RELEASE配置更新后,并不会刷新。

resources下面新建bootstrap.yaml,并在nacos上面创建好module-01.yaml

spring:
  application:
    name: module-01
  cloud:
    nacos:
      config:
        refresh:
          enabled: true
        server-addr: localhost
        file-extension: yaml

module-01.yaml的内容如下:

③创建启动类。与普通Spring Boot应用无区别。

package com.example.springloud.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

④创建获取配置信息的接口。需要加上@RefreshScope,以使自动刷新生效。

package com.example.springloud.demo.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("config")
@RefreshScope
public class GetDynamicValueController {
    @Value(value = "${hello}")
    private String dynamicValueStr;

    @RequestMapping("get")
    public String getStr() {
        return dynamicValueStr;
    }
}

⑤修改配置,看能否自动刷新。如果加了@RefreshScope注解,但还是不能自动刷新,可考虑检查Spring Boot与spring-cloud-starter-alibaba-nacos-config版本是否一致。

服务注册与发现

在开始之前,还是要注意一下版本问题。

①pom文件导入spring-cloud-starter-alibaba-nacos-discovery。版本选的2.2.0.RELEASE,原因同上所述。如果不能运行了,那么再参看官网wiki上面的版本对应表进行修改。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.2.0.RELEASE</version>
</dependency>

②bootstrap.yaml文件中加入服务发现相关的配置:

spring:
  application:
    name: module-01
  cloud:
    nacos:
      discovery:
        server-addr: localhost
      config:
        server-addr: localhost
        file-extension: yaml

③创建RestTemplate实例,然后加上@LoadBalanced注解,开启 @LoadBalancedRibbon 的集成。

package com.example.springloud.demo.beans;

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;

@Configuration
public class LoadBalancedTemplate {
    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

④在Controller中注入restTemplate,然后新建一个新的接口config/remote-get,通过nacos,调用注册在其上的config/get接口,作为返回。

package com.example.springloud.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@RequestMapping("config")
@RefreshScope
public class GetDynamicValueController {
    @Value(value = "${hello}")
    private String dynamicValueStr;

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("get")
    public String getStr() {
        return dynamicValueStr;
    }

    @RequestMapping("remote-get")
    public String getStrViaNacos() {
        return restTemplate.postForObject("http://module-01/config/get", null, String.class);
    }
}

此时的demo整体架构为:

⑤运行代码,可以观察到nacos上面的服务列表中出现了module-01:

调用config/remote-get接口,正常返回config/get接口的数据:

Read more

Volcano 与 Kubernetes GPU 调度学习笔记

本笔记系统整理 Volcano 调度器、Kubernetes 调度框架、GPU Device Plugin、HAMi 等云原生 AI 调度领域的核心知识,适合用于学习、复习和工程实践参考。 目录 * 第一部分:Volcano 入门 * 1. Volcano 是什么 * 2. 安装与快速使用 * 3. 核心特性一览 * 第二部分:Volcano 整体架构 * 4. Volcano 解决的核心问题 * 5. 整体架构与数据流 * 6. 三层抽象模型 * 第三部分:Volcano 核心实现原理 * 7. Session 机制 * 8. Gang Scheduling 实现 * 9. Queue 与 DRF 公平调度

容器镜像(4):镜像的常用工具箱

容器镜像(4):镜像的常用工具箱

前几篇在讲多架构镜像时已经用过 skopeo 和 crane 做镜像复制,这篇系统整理这两个工具的完整能力,同时介绍几个日常操作镜像时同样好用的工具。 一、skopeo:不依赖 Daemon 的镜像瑞士军刀 skopeo 的核心价值是绕过 Docker daemon,直接与 Registry API 交互。上一篇用它做镜像复制和离线传输,但它的能力远不止于此。 1.1 安装 # Ubuntu / Debian sudo apt install -y skopeo skopeo --version # skopeo version 1.15.1 1.2 inspect:免拉取检查镜像元数据 docker inspect 需要先把镜像拉到本地,skopeo inspect 直接向 Registry

容器镜像(3):多架构镜像构建

容器镜像(3):多架构镜像构建

一、什么是多架构镜像 1.1 OCI Image Index 上一篇介绍了单平台镜像的结构:一个 Manifest 指向 Config 和若干 Layer blob。多架构镜像在此之上多了一层——OCI Image Index(也叫 Manifest List),是一个轻量的索引文件,把多个单平台 Manifest 组织在一起: $ docker manifest inspect golang:1.22-alpine { "schemaVersion": 2, "mediaType": "application/vnd.oci.image.index.v1+json", "manifests&

容器镜像(2):containerd 视角下的镜像

容器镜像(2):containerd 视角下的镜像

一、为什么需要了解 containerd 如果你只用 docker run 跑容器,从来不关心底层,那可以不了解 containerd。但如果你在用 Kubernetes,或者想真正理解"容器运行时"是什么,containerd 是绕不开的。 事实上,当你执行 docker run 的时候,containerd 早就在后台悄悄工作了——Docker 从 1.11 版本开始,就把核心运行时剥离出来交给 containerd 负责。 1.1 Docker 的架构演变 早期的 Docker(1.10 及之前)是一个"大一统"的单体程序:一个 dockerd