Spring Cloud Alibaba版本教程-Nacos服务注册和发现

在前面一篇文章中已经介绍了版本选择和构建父工程,该篇文章将介绍如何使用Nacos实现服务的注册与发现。

Nacos简介

Nacos是Dynamic Naming and Configuration Service的首字母简称。它主要提供了服务注册发现和配置管理功能,不过我们目前只介绍服务的注册和发现。在这之前我们需要先配置好Nacos的服务环境。

资源下载

Nacos目前有两个大版本分别为1.x和2.x,不过官网说目前推荐使用Nacos2.x的版本,虽然我们目前工程中依赖的nacos client版本为1.4,但是Nacos2.x支持该版本客户端,所以这里我选择了Nacos版本为2.1.2。关于Nacos下载地址,我们可以通过github上的发行版本选择下载,地址如下:

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

安装和配置

安装比较简单,首先本地需要有JDK环境,不过相信看该教程的同学这个问题不是很大。加压安装包之后一共有三个文件夹:

  • bin存放了启动脚本相关命令。

  • conf配置文件目录

  • targetNacos应用目录。

我这里是为了学习所以在同一台机器上安装三个节点的Nacos,实际生产环境需要单独安装。将解压文件复制三份,分别命名为nacos-8848nacos-8850nacos-8852

修改数据库配置

默认情况下,Nacos使用的derby存储的相关数据信息,这里我们修改成Mysql的方式。修改很简单,只需要修改conf/application.properties文件即可,修改如下:

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=root

具体配置根据自己实际情况来填写。在修改完配置文件之后,需要初始化数据,这里我先在数据库中创建nacos库,然后运行初始化脚本mysql-schema.sql即可完成数据库初始化。

修改端口

我这里在一台机器上启动了三个节点,如果不修改端口会报端口冲突。所以还需要修改conf/application.properties配置中如下:

server.port=端口

注意:我这里使用的端口分别为884888508852。Nacos通信除了使用配置的端口外,还需要使用其他三个端口,其分别为:

  • raft port:${server.port}  – 1000

  • grpc port:${server.port} + 1000

  • grpc port for server:${server.port} + 1001

如果端口设置为884888498850最后会造成冲突。

集群配置

集群配置只需要修改conf/cluster.conf配置文件即可。默认情况下,该文件没有,直接创建即可。我这里配置文件如下:

192.168.1.11:8848
192.168.1.11:8850
192.168.1.11:8852

注意:在本机上最好指定IP地址,不要使用127.0.0.1,使用该配置可能导致Nacos UI 界面显示的集群信息不正确。

启动

上面都改好之后,执行bin/startup.cmd命令分别启动三个节点。我这里是Windows环境,如果你是Linux环境还请执行.sh结尾的命令。

启动之后,输入http://ip:8848/nacos即可打开登录页面,默认情况下,Nacos的登录名和密码都是nacos

服务注册

上面介绍了如何运行Nacos服务,现在我们来使用Nacos服务注册。创建子模块工程nacos-register,其pom.xml依赖如下:

<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">

    <parent>
        <artifactId>spring-cloud-alibaba-demo</artifactId>
        <groupId>com.zc</groupId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>nacos-register</artifactId>
    <packaging>jar</packaging>

    <name>nacos-register</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <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>
        </dependency>
    </dependencies>
</project>

该配置文件的核心是添加spring-cloud-starter-alibaba-nacos-discovery依赖。当项目构建成功之后,在application.yml添加如下配置:

server:
  port: 9001 # 服务端口
spring:
  application:
    name: nacos-register # 服务名称
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.1.11:8848,192.168.1.11:8850,192.168.1.11:8852 # nacos地址
        username: nacos # nacos用户名
        password: nacos # nacos密码

最后不要忘了在启动类型增加@EnableDiscoveryClient注解。为了等下测试服务发现,我这里还创建了一个测试接口,内容如下:

@RestController
public class HelloController {

    @Value("${server.port}")
    private Integer serverPort;

    @GetMapping("hello")
    public Object hello(){
        return "Hello World! " + serverPort;
    }

}

到此我们服务使用Nacos作为注册中心已经实现了,启动服务在Nacos的管理后台服务管理->服务列表就能看到我们刚才创建的服务了。

Spring Cloud Alibaba版本教程-Nacos服务注册和发现

服务发现

上面我们已经演示了服务的注册,接来下就是服务发现。重新创建子工程nacos-discovery,该子项目和前面的nacos-register依赖基本相同。对于pom文件内容这里就不再展示了,同时其application.yml修改如下:

server:
  port: 9002 # 服务端口
spring:
  application:
    name: nacos-discovery # 服务名称
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.1.11:8848,192.168.1.11:8850,192.168.1.11:8852 # nacos地址
        username: nacos # nacos用户名
        password: nacos # nacos密码

这里基本上跟之前项目的配置保持一致,只是修改了服务端口和服务名称配置。接下来我们通过下面文件构建一个测试接口,示例代码如下:

@RestController
public class DiscoveryController {
    @Resource
    private DiscoveryClient discoveryClient;
    @Resource
    private RestTemplate restTemplate;
    private SecureRandom random = new SecureRandom();

    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

    @GetMapping("say_hello")
    public Object sayHello(){
        //获取服务实例列表
        String serviceId = "nacos-register";
        List<ServiceInstance> instances = discoveryClient.getInstances(serviceId);
        if (instances.size() == 0){
            throw new RuntimeException(String.format("没有可用的服务[%s]",serviceId));
        }
        //随机选取一个服务实例
        int index = random.nextInt(instances.size());
        ServiceInstance instance = instances.get(index);
        //调用服务
        String url = String.format("http://%s:%s/hello", instance.getHost(), instance.getPort());
        ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
        return response.getBody();
    }

}

这段代码简单的分析如下:

  • 通过注入DiscoveryClient获取到实例,该实例提供了获取服务实例相关方法。同时我们这里还创建了一个RestTemplate实例用来调用接口。

  • 接下来就是sayHello方法的内容了:

    最后通过访问接口http://localhost:9002/say_hello将返回如下信息:

    Hello World! 9001
    • 获取nacos-register服务实例。这里面获取到的是一个list列表,说明我们的服务可以提供多个不同实例。

    • 随机获取一个实例。

    • 获取实例相关信息,例如IPPORT等信息组装成实际服务调用地址。

相关资料

工程相关示例代码地址:https://github.com/I-Like-Pepsi/spring-cloud-alibaba-demo


SpringCloud Alibaba版本教程-开始


原文始发于微信公众号(一只菜鸟程序员):Spring Cloud Alibaba版本教程-Nacos服务注册和发现

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/72794.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!