返回 导航

SpringBoot / Cloud

hangge.com

SpringCloud - 服务注册与配置中心Nacos使用详解3(服务的注册、发现与消费)

作者:hangge | 2020-12-04 08:10
    同 Eureka 一样,如果在 SpringCloud 项目中接入 Nacos 作为注册中心,它同样完全兼容 Spring Cloud RibbonHystrixOpenFeign 等组件。即使原先项目使用的是 Eureka 作为注册中心,想要切换成 Nacos 只需要改个依赖,加个配置就可以了,十分简单。
    下面通过一个服务的发现与消费样例进行演示,样例包含三个服务实例:服务注册中心 nacos-server、服务提供者 hangge-provider、服务消费者 hangge-consumer。同时消费者通过 RestTemplate + Ribbon 的方式来进行服务调用的。

三、服务的注册、发现与消费

1,准备服务注册中心(nacos-server)

首先我们要部署好 Nacos 服务注册中心,具体步骤可以参考我之前写的文章:

2,创建服务提供者(hangge-provider)

(1)首先我们创建一个 Spring Initializr 工程,并且创建时勾选上 Spring Web 以及 Nacos Service Discovery 依赖:

(2)这些依赖如果创建时候没有勾选,也可等创建完毕后手动编辑 pom.xml 文件进行添加:
<properties>
    <java.version>1.8</java.version>
    <spring-cloud-alibaba.version>2.2.0.RELEASE</spring-cloud-alibaba.version>
</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>

<dependencyManagement>
    <dependencies>
        <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>

(3) 接着编辑 application.properites 文件,添加如下配置为服务命名,并指定服务注册中心的地址:
#为服务命名
spring.application.name=hangge-provider
#指定服务注册中心的地址
spring.cloud.nacos.discovery.server-addr=192.168.60.133:8848

(4)接下来步骤就跟原先使用 Eureka 时是一样的,在主类上添加 @EnableDiscoveryClient 注解,激活 Nacos 中的 DiscoveryClient 实现:
@SpringBootApplication
@EnableDiscoveryClient
public class HanggeProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(HanggeProviderApplication.class, args);
    }
}

(5)最后创建一个 Controller,提供个测试接口供后面消费者调用:
@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "欢迎访问 hangge.com";
    }
}

(6)启动 HanggeProviderApplication,访问 Nacos 的控制台页面,可以看到 hangge-provider 服务的注册信息:
 

3,创建服务消费者(hangge-consumer)

(1)同样创建一个 Spring Initializr 模块工程,名为 hangge-consumer。创建时除了勾选上 Spring Web Nacos Service Discovery 依赖,还需勾选上 Ribbon 依赖:

(2)这些依赖如果创建时候没有勾选,也可等创建完毕后手动编辑 pom.xml 文件进行添加:
<properties>
    <java.version>1.8</java.version>
    <spring-cloud-alibaba.version>2.2.0.RELEASE</spring-cloud-alibaba.version>
    <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
</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>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <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>

(3)模块创建完毕后,编辑该模块的 application.properites 文件,添加如下配置为服务命名,并指定服务注册中心的地址:
#设置端口,防止冲突
server.port=9000
#为服务命名
spring.application.name=hangge-consumer
#指定服务注册中心的地址
spring.cloud.nacos.discovery.server-addr=192.168.60.133:8848

(4)接下来步骤就跟原先使用 Eureka 时是一样的,主类上添加 @EnableDiscoveryClient 注解,让该应用注册为 Nacos 客户端应用,以获得服务发现的能力。同时,在该主类中创建 RestTemplateSpring Bean 实例,并通过 @LoadBalanced 注解开启客户端负载均衡。
@SpringBootApplication
@EnableDiscoveryClient
public class HanggeConsumerApplication {

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

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

(5)创建一个 ConsumerController并实现 /hello-consumer 接口。在该接口中,通过前面定义的 RestTemplate 来实现对 hangge-provider 服务提供的 /hello 接口进行调用:
@RestController
public class ConsumerController {
    @Autowired
    RestTemplate restTemplate;

    @GetMapping("/hello-consumer")
    public String helloConsumer() {
        // 通过服务名调用服务提供者的接口
        return restTemplate.getForEntity("http://hangge-provider/hello", String.class).getBody();
    }
}

(6)启动 HanggeConsumerApplication,再次访问 Nacos 控制台,可以看到 hangge-consumer 服务的注册信息:

(7)而使用浏览器访问 http://localhost:9000/hello-consumer 则显示如下内容,说明消费者调用服务提供者接口成功:
评论

全部评论(0)

回到顶部