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

搭建微服务框架(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-sc-provider.png

如上,分别以 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控制台中直观的找到该服务的信息:

nacos-squid-example-provider.png

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


SpringCloud服务订阅

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

squid-example-consumer.png

新建的工程我们以 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-discovery.jpeg

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


总结

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

参考资料:

SpringCloud(IO)

SpringCloud(GITHUB)

posted @ 2020-05-29 17:08  严阵以待  阅读(563)  评论(0编辑  收藏  举报