搭建SpringCloud微服务框架二SpringCloud服务注册与发现

127次阅读

共计 4213 个字符,预计需要花费 11 分钟才能阅读完成。

搭建微服务框架(SC 服务注册与发现)

本文源地址:https://yanzhenyidai.com/#/squid/squid-2.1-sc-server

Github 地址:SQuid


服务注册中心 -Nacos

Nacos 是阿里开源的一款注册中心中间件,详细介绍可以访问 Nacos 官网,本次框架是基于 Nacos 做的注册。

安装 Nacos 我们可以使用 Docker,Docker 可以很快的安装好 Nacos 并且启动。

而在本项目中,引入的 Nacos 两个依赖分别如下:

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

完成对 Nacos 的依赖引入后,可以进行下一步的 SpringCloud 服务发布的操作,?。


SpringCloud 服务发布

我们新建俩个 Maven 模块项目,用它来实现服务提供者的角色。

如上,分别以 squid-example-apisquid-example-provider 命名。

  • squid-example-api

squid-example-api 项目中主要是写一些接口文件,将这些接口对外注册并且暴露出去,引入依赖:

   <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-openfeign</artifactId>
   </dependency>

新建一个 HiService 的接口,并且注明 @FeignClient("squid-example-sc-provider"),注解内名称可以为项目名:

   @FeignClient("squid-example-sc-provider")
   public interface HiService {@RequestMapping(value = "/hi", method = RequestMethod.GET)
       public String hi(@RequestParam("msg") String msg);
   }
   

PS:这里是为了明确各个模块,所以将 squid-example-apisquid-example-provider 进行分离,也可以将两个模块合并。

  • squid-example-provider

然后我们依旧是在 squid-example-provider 引入依赖:

   <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-openfeign</artifactId>
   </dependency>

   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
   
   <dependency>
       <groupId>com.yanzhenyidai</groupId>
       <artifactId>squid-example-sc-api</artifactId>
       <version>1.0-SNAPSHOT</version>
   </dependency>

引入 spring-cloud-start-openfeign 是将服务以 Http Restful 的形式进行对外发布(SC 的服务基本上都是以 Http Restful 的形式,
可以了解一下 Dubbo 或者其他 RPC 的服务注册,也可以看一下 [RPC 和 HTTP]()),而 spring-boot-starter-web 则是表明该项目需要以 Web 的形式进行启动,
不难理解,毕竟 HTTP 请求是有需要一个 Web 容器来进行。

一切准备就绪后,我们就可以开始来编写服务实现和启动服务类了。

在项目中最外层的包路径中新建一个 Application 的启动类,这点原因熟悉 Spring 加载逻辑的同学应该都明白,Spring 启动扫描时是向下扫描,也就是加载包路径以下的
代码配置:

   @SpringBootApplication
   @EnableDiscoveryClient
   @EnableFeignClients
   @RestController
   public class ScProviderApplication {
   
       @Autowired
       private HiService hiService;
   
       public static void main(String[] args) {SpringApplication.run(ScProviderApplication.class, args);
       }
   
   
       @GetMapping(value = "/hi")
       public String hi(String msg) {return hiService.hi(msg);
       }
   }
   

继续编写一个 HiService 的实现 HiServiceImpl

  @Service
  public class HiServiceImpl implements HiService {
  
      @Override
      public String hi(String msg) {return "hi sc," + msg;}
  }

贴一下 application.yaml 文件信息:

  spring:
    application:
      name: squid-example-sc-provider
    cloud:
      nacos:
        discovery:
          server-addr: 127.0.0.1:8848
      discovery:
        client:
          health-indicator:
            enabled: false
  server:
    port: 8084
  ribbon:
    ReadTimeout: 100000
    ConnectTimeout: 100000

接下来就可以在 Application 类中直接启动了。

没有报错的话,可以访问以下路径 localhost:8084/hi?msg=Hi,以检验服务是否发布成功。

也可以在 Nacos 控制台中直观的找到该服务的信息:

一切都 OK 了,继续下一步?。


SpringCloud 服务订阅

服务可以正常注册之后,我们来新建一个工程模拟消费者进行请求,如下图:

新建的工程我们以 squid-example-consumer 来命名,来对应 squid-example-provider 的意思。

照样,我们需要引入依赖:

   <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-openfeign</artifactId>
   </dependency>

   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
   
   <dependency>
       <groupId>com.yanzhenyidai</groupId>
       <artifactId>squid-example-sc-api</artifactId>
       <version>1.0-SNAPSHOT</version>
   </dependency>

依赖与 squid-example-provider 一致,紧接着,我们可以来编写调用 squid-example-provider 对外暴露的 HiService 接口,同样新建一个 Application
的启动类:

   @SpringBootApplication
   @EnableDiscoveryClient
   @EnableFeignClients
   @RestController
   public class ScConsumerApplication {
   
       @Autowired
       private HiService hiService;
   
       @GetMapping(value = "/hi")
       public String hi(String msg) {return hiService.hi(msg);
       }
   
       public static void main(String[] args) {SpringApplication.run(ScConsumerApplication.class, args);
       }
   }

application.yaml 文件:

   spring:
     application:
       name: squid-example-sc-provider
     cloud:
       nacos:
         discovery:
           server-addr: 127.0.0.1:8848
       discovery:
         client:
           health-indicator:
             enabled: false
   server:
     port: 8085
   ribbon:
     ReadTimeout: 100000
     ConnectTimeout: 100000

启动 squid-example-consumerApplication 后,我们可以访问 localhost:8085/hi?msg=Hi 来进行验证,此时如果先打端点在 squid-example-providerHiServiceImpl 方法实现上,可以看到程序进入到了该断点。

虽然本意上 squid-example-consumber 工程是多此一举,毕竟现在项目大多都是前后端分离,不过通过这个消费工程也可以明白到 Nacos 是怎么做到的服务发现,以及如果内部服务需要相互调用,也可以这样进行。

PS:Nacos 的服务发现:

上图是 Nacos 官网的基础机构及概念图,大致看上去逻辑和 Zookeeper 的调用机制类似。服务先将关键信息注册到 Nacos,调用时根据协议再去请求各个服务。这里不做多提,感兴趣可以下 [Zookeeper 服务注册和发现]()。


总结

SpringCloud 作为近期很火的微服务框架,本篇记录的是个人搭建 SpringCloud 服务的一些记录,感谢您的阅读,希望能帮助到你,如果有遇到问题,可以发送邮件到 frank-tan@outlook.com。

参考资料:

SpringCloud(IO)

SpringCloud(GITHUB)

正文完
 0