Spring Cloud Alibaba——SpringBoot+Nacos实现服务的注册与发现

自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注。虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭借阿里中间件团队的背景,还是得到不少团队的支持;同时,由于Spring Cloud Alibaba中的几项主要功能都直指Netflix OSS中的重要组件,而后者最近频繁宣布各组件不在更新新特性,这使得Spring Cloud Alibaba关注度不断飙升,不少开发者或团队也开始小范围试水。

什么是Nacos的服务注册与发现

在讲什么是服务注册与发现之前,我们先举一个生活的例子,就比如我们平时租房子找中介的事情。在没有中介的时候我们需要一个一个去寻找是否有房屋要出租的房东,这显然会非常的费力,一你找凭一个人的能力是找不到很多房源供你选择,再者你也懒得这么找下去(找了这么久,没有合适的只能将就)。
这里的我们就相当于微服务中的 Consumer ,而那些房东就相当于微服务中的 Provider 。消费者 Consumer 需要调用提供者 Provider 提供的一些服务,就像我们现在需要租他们的房子一样。而Nacos就相当于上面的中介。

接下来就分别创建两个SpringBoot项目分别表示服务者和消费者

构建应用接入Nacos注册中心

  • 创建服务提供者
  1. 创建一个SpringBoot项目,可命名为alibaba-nacos-discovery-server
  2. 导入相关的pom依赖
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>0.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.2</version>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.5.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

上述内容主要三部分:

  • parent:定义spring boot的版本
  • dependencyManagement:spring cloud的版本以及spring cloud alibaba的版本,由于spring cloud alibaba还未纳入spring cloud的主版本管理中,所以需要自己加入
  • dependencies:当前应用要使用的依赖内容。这里主要新加入了Nacos的服务注册与发现模块:spring-cloud-starter-alibaba-nacos-discovery。由于在dependencyManagement中已经引入了版本,所以这里就不用指定具体版本了。
  1. 在启动类中添加相注解 @EnableDiscoveryClient,该注解开启Spring Cloud的服务注册与发现,由于这里引入了spring-cloud-starter-alibaba-nacos-discovery模块,所以Spring Cloud Common中定义的那些与服务治理相关的接口将使用Nacos的实现。这点不论我们使用Eureka、Consul还是其他Spring Cloud整合的注册中心都一样,这也是Spring Cloud做了封装的好处所在。
  2. 创建一个ServerController实现一个http接口(即消费提供者提供的方法接口,到时候消费者同样从nacos中调用该接口方法即可)
@RestController
@Slf4j
public class ServerController {
     
    @GetMapping("/hello")
    public String hello(@RequestParam String name){
     
        log.info("invoke name = " + name);
        return "hello "+ name;
    }
}
  1. 在application.yml编写相关配置
spring:
  application:
    name: alibaba-nacos-discovery-server
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.01:8848
server:
  port: 8001
  • 开启启动类,在控制台中看到如下内容说明服务已注册成功,我们也可以访问Nacos的管理界面来查看服务列表
    在这里插入图片描述
    Spring Cloud Alibaba——SpringBoot+Nacos实现服务的注册与发现_第1张图片

  • 创建服务消费者
  1. 同样先创建一个SpringBoot项目,命名为:alibaba-nacos-discovery-client-common
  2. 添加相关的pom依赖,与服务提供者的一样即可,不过由于下面我使用的是Feign的服务消费方式,因此还需要增加openfeign的依赖
		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
  1. 同样在启动类上添加注解@EnableDiscoveryClient,同时还要再添加一个注解@EnableFeignClients开启扫描Spring Cloud Feign客户端的功能
@SpringBootApplication4.
@EnableDiscoveryClient
@EnableFeignClients
public class DemoApplication {
     

    public static void main(String[] args) {
     
        SpringApplication.run(DemoApplication.class, args);
    }
}
  1. 定义Feign客户端和使用Feign客户端

1) Feign的客户端接口定义

  • @FeignClient注解来指定这个接口所要调用的服务名称,接口中定义的各个函数使用Spring MVC的注解就可以来绑定服务提供方的REST接口,比如下面就是绑定alibaba-nacos-discovery-server服务的/hello接口的例子。
@FeignClient("alibaba-nacos-discovery-server")
public interface Client {
     
    @GetMapping("/hello")
    String hello(@RequestParam(value = "name")String name);
}

2)Client接口的实现

@Slf4j
@RestController
public class ClientController {
     
    @Autowired
    Client client;

    @GetMapping("/clientTest")
    public String test(String name){
     
        String result = client.hello(name);
        return "从服务注册中心调用的hello方法返回值:"+result;
    }
}
  1. 在application.yml中配置服务名称和Nacos地址,让服务消费者可以发现上面已经注册到Nacos的服务。
spring:
  application:
    name: alibaba-nacos-discovery-client-common
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
server:
  port: 9000
  1. 启动服务消费者,同样可以在管理界面看到相关信息
    Spring Cloud Alibaba——SpringBoot+Nacos实现服务的注册与发现_第2张图片

这里我在PostMan中进行测试localhost:9000/clientTest?name=sakura
Spring Cloud Alibaba——SpringBoot+Nacos实现服务的注册与发现_第3张图片
同时在消费提供者的控制台上也打印了相关信息

在这里插入图片描述


最后用一个图来总结一下
Spring Cloud Alibaba——SpringBoot+Nacos实现服务的注册与发现_第4张图片

你可能感兴趣的:(Spring,Cloud,Alibaba,Spring,Cloud,ncaos,springboot,feign)