侧边栏壁纸
博主头像
王小木人

这是很长,很好的一生

  • 累计撰写 141 篇文章
  • 累计创建 43 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

使用nacos作为注册中心实现服务注册与发现

王小木人
2021-06-17 / 0 评论 / 0 点赞 / 1,782 阅读 / 7,742 字

nacos注册中心

springcloud中使用eureka作为注册中心相对来说功能单一,界面不友好,不方便查看和管理微服务,阿里巴巴提供了一个更好的注册和配置中心那就是nacos,不单单可以作为服务的注册中心,同时也提供服务配置,监控等功能,界面也更加人性化,用官方的说法就是 Nacos 致力于帮助您发现、配置和管理微服务 nacos官网地址

下载nacos

下载地址 https://github.com/alibaba/nacos/releases

20210617_1709.png

下载后解压缩进入bin目录

启动nacos服务

Linux/Unix/Mac
启动命令(standalone代表着单机模式运行,非集群模式):

sh startup.sh -m standalone

如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:

bash startup.sh -m standalone

Windows
启动命令(standalone代表着单机模式运行,非集群模式):

startup.cmd -m standalone

启动完成后,登陆页面:http://localhost:8848/nacos/,登陆用户nacos,登陆密码为nacos。

20210617_1716.png

这样服务注册中心启动完成,接下来就是创建服务并向里面注册。

创建服务提供方

新建一个springboot项目provider,
pom.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.springcloud</groupId>
    <artifactId>provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>provider</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-boot.version>2.4.4</spring-boot.version>
        <spring-cloud.version>2020.0.2</spring-cloud.version>
        <spring-cloud-alibaba.version>2020.0.RC1</spring-cloud-alibaba.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <!-- spring boot 依赖 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- spring cloud 依赖 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- spring cloud alibaba 依赖 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--nacos 服务注册发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

application.properties 文件

server.port=8001
#服务名
spring.application.name=nacos-provider
#注册中心地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

启动类上增加注解 @EnableDiscoveryClient 表示向nacos中注册服务。

20210617_1739.png

增加一个控制类HelloController,向外提供一个接口。

20210617_1743.png

package com.springcloud.provider;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @program: provider
 * @description:
 * @author: Mr.Wang
 * @create: 2021-06-17 16:36
 **/

@RestController
public class HelloController {
    @Value("${server.port}")
    private String port;

    @GetMapping("/hello")
    public String hello() {
        return "Hello Nacos Discovery " + this.port;
    }
}

启动服务,访问接口 http://localhost:8001/hello,返回Hello Nacos Discovery 8001,表示该服务运行在端口8001上。

20210617_1748.png

此时nacos的服务列表多了一个服务,说明该服务注册成功。

20210617_1750.png

创建服务消费方

当服务完成注册后,其他服务如果要使用该服务提供的接口,则此时需要消费服务,每个服务都是可以相互之间调用的,所以服务可以是消费方同时也可以是服务提供方,服务消费依然使用 openfeign实现远程调用。
新建一个springboot项目consumer。
pom.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.springcloud</groupId>
    <artifactId>consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>consumer</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-boot.version>2.4.4</spring-boot.version>
        <spring-cloud.version>2020.0.2</spring-cloud.version>
        <spring-cloud-alibaba.version>2020.0.RC1</spring-cloud-alibaba.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- spring boot 依赖 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- spring cloud 依赖 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- spring cloud alibaba 依赖 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


    <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>
        <!--服务的调用-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--调用服务实现负载均衡 不加无法启动-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>


    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

配置文件 application.properties

server.port=9001
#服务名
spring.application.name=nacos-consumer
#注册中心地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

启动类增加注解 @EnableDiscoveryClient 和 @EnableFeignClients,分别表示服务注册和服务调用

20210617_1801.png

新建一个feign调用接口ProviderClient,该接口通过feign远程调用服务

20210617_1803.png

package com.springcloud.consumer;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(value = "nacos-provider" )
public interface ProviderClient {

    @GetMapping("/hello")
    String hi();
}

再新建一个控制器ConsumerController,测试接口调用

20210617_1806.png

package com.springcloud.consumer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @program: consumer
 * @description:
 * @author: Mr.Wang
 * @create: 2021-06-17 16:49
 **/

@RestController
public class ConsumerController {

    @Autowired
    ProviderClient providerClient;

    @GetMapping("/hi-feign")
    public String hiFeign(){
        return providerClient.hi();
    }
}

启动服务,此时nacos 服务列表多了一个名为nacos-consumer 的服务。

20210617_1811.png

访问接口 http://localhost:9001/hi-feign,返回字符串Hello Nacos Discovery 8001,此则说明通过feign远程调用服务成功。

20210617_1809.png

服务集群与负载均衡

修改项目provider 的端口为8002,再次启动,(需要先修改idea允许在多个端口运行),此时该服务运行在8001和8002两个和端口上,nacos服务名nacos-provider的服务显示有两个。

20210617_1815.png

重新访问接口 http://localhost:9001/hi-feign 并不停刷新,接口交替返回字符串 Hello Nacos Discovery 8002和Hello Nacos Discovery 8001,说明此时实现了服务的负载均衡了。

项目下载地址

服务提供方:https://github.com/378526425/springcloud-provider.git
服务消费方:https://github.com/378526425/springcloud-consumer.git

Spring Cloud微服务架构设计与开发实战

0

评论区