美文网首页
Nacos - 服务发现(4.1)

Nacos - 服务发现(4.1)

作者: __元昊__ | 来源:发表于2020-01-03 11:22 被阅读0次

    4 Spring Cloud Alibaba 综合集成架构演示

    前面说到,Spring Cloud是一个较为全面的微服务框架集,集成了如服务注册发现、配置中心、消息总线、负载均衡、断路器、API网关等功能实现。而在网上经常会发现Spring Cloud与阿里巴巴的Dubbo进行选择对比,这样做其实不是很妥当,前者是一套较为完整的架构方案,而Dubbo只是服务治理与RPC实现方案。

    Dubbo在国内有着非常大的用户群体,但是其周边设施与组件相对来说并不那么完善。很多开发者用户又很希望享受Spring Cloud的生态,因此也会有一些Spring Cloud与Dubbo一起使用的案例与方法出现,但是一直以来大部分Spring Cloud整合Dubbo的使用方案都不完善。直到Spring Cloud Alibaba的出现,才得以解决这样的问题。

    在此之前,我们已经学了如何使用Spring Cloud Alibaba来集成Nacos与Spring Cloud应用,并且在此之下可以如传统的Spring Cloud应用一样地使用Ribbon或Feign来微服务之间的协作。由于Feign是基于Http Restful的调用,在高并发下的性能不够理想,RPC方案能否切换为Dubbo?Spring Cloud与阿里系的若干组件能否完美集成呢?

    可以!本章内容将指引大家集成一个微服务的基础架构,并讨论其合理性。

    4.1 总体结构

    系统架构图如下:


    QQ截图20200103090611.png

    组件说明:
    API网关 :系统统一入口,屏蔽架构内部结构,统一安全拦截,采用Zuul实现。
    application-1 :应用1,模拟应用,提供http接口服务。
    service-1 :微服务1,模拟微服务,提供dubbo接口服务。
    service-2 :微服务2,模拟微服务,提供dubbo接口服务。

    调用流程:
    所有访问系统的请求都要经过网关,网关转发Http请求至application-1,application-1使用dubbo调用service1完成自身业务,而后sevice1调用service2完成自身业务。至此,完成所有组件贯穿。

    架构中application与sevice的区别是什么?

    • service提供了基础服务功能;application组装基础服务功能,提供给用户直接可用的业务。
    • service服务粒度小、功能基础,不易发生改变;application提供上游业务功能,紧贴业务需求,容易发生改变。
    • 形成service支撑application的整体架构,增加多变的application甚至不需要变动service。

    4.3 工程结构说明

    采用maven工程,结构如下:


    QQ截图20200103091012.png

    4.4 创建父工程

    创建 artifactId 名为 nacos-micro-service 的 Maven 工程,此父工程继承nacos-discovery父工程,间接指定了Spring boot、spring cloud 以及spring-cloud-alibaba的依赖版本。

    <parent>
    <artifactId>nacos‐discovery</artifactId>
    <groupId>com.itheima.nacos</groupId>
    <version>1.0‐SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>nacos‐micro‐service</artifactId>
    <packaging>pom</packaging>
    

    nacos-discovery的pom.xml如下:

    <groupId>com.itheima.nacos</groupId>
    <artifactId>nacos‐discovery</artifactId>
    <version>1.0‐SNAPSHOT</version>
    <packaging>pom</packaging>
    <properties>
    <project.build.sourceEncoding>UTF‐8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF‐8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    </properties>
    <dependencyManagement>
    <dependencies>
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring‐cloud‐alibaba‐dependencies</artifactId>
    <version>2.1.0.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
    </dependency>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring‐cloud‐dependencies</artifactId>
    <version>Greenwich.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring‐boot‐dependencies</artifactId>
    <version>2.1.3.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
    </dependency>
    </dependencies>
    </dependencyManagement>
    <build>
    <plugins>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring‐boot‐maven‐plugin</artifactId>
    </plugin>
    </plugins>
    </build>
    

    4.5 实现application1

    application1属于应用层,提供http接口服务。
    (1)初始化 application-1 Maven 工程

    <artifactId>application‐1</artifactId>
    <dependencies>
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring‐cloud‐starter‐alibaba‐nacos‐config</artifactId>
    </dependency>
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring‐cloud‐starter‐alibaba‐nacos‐discovery</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring‐boot‐starter‐web</artifactId>
    </dependency>
    </dependencies>
    

    (2)实现 application-1 功能

    package com.itheima.microservice.application1.controller;
    
    @RestController
    public class Application1Controller {
    @GetMapping("/service")
    public String service(){
    return "test" ;
    }
    }
    

    (3) application1 配置
    纯粹的dubbo服务消费者,配置看起来更简单。
    定义bootstrap.yml

    server:
      port: 56020 #启动端口 命令行注入
      servlet:
        context‐path: /application1
    
    spring:
      application:
        name: application1
      main:
        allow‐bean‐definition‐overriding: true # Spring Boot 2.1 需要设定
      cloud:
        nacos:
          discovery:
            server‐addr: 127.0.0.1:8848
            namespace: c67e4a97‐a698‐4d6d‐9bb1‐cfac5f5b51c4
    
            cluster‐name: DEFAULT
          config:
            server‐addr: 127.0.0.1:8848 # 配置中心地址
            file‐extension: yaml
            namespace: c67e4a97‐a698‐4d6d‐9bb1‐cfac5f5b51c4 # 开发环境
            group: NACOS_MICROSERVICE_GROUP # xx业务组
    

    (4) application1 启动

    @SpringBootApplication
    @EnableDiscoveryClient
    public class Application1Bootstrap {
    public static void main(String[] args) {
    SpringApplication.run(Application1Bootstrap.class,args);
    }
    }
    

    当 Service1Bootstrap 启动后,应用 application1 将出现在 Nacos 控制台界面。

    4.6 实现 Service1

    4.6.1 定义父工程

    定义service1父工程,pom.xml如下:

    <parent>
    <artifactId>nacos‐micro‐service</artifactId>
    <groupId>com.itheima.nacos</groupId>
    <version>1.0‐SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>Service1</artifactId>
    
    4.6.2 定义service-1-api

    为了方便其它服务调用dubbo服务,专门定义api工程,此工程将作为jar被其它工程依赖。
    定义service-1-api工程,pom.xml如下:

    <parent>
    <artifactId>Service1</artifactId>
    <groupId>com.itheima.nacos</groupId>
    <version>1.0‐SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>service‐1‐api</artifactId>
    

    定义服务接口:

    package com.itheima.microservice.service1.api;
    public interface ConsumerService {
    public String service();
    }
    
    4.6.3 实现service-1-server

    (1)初始化 service-1-server Maven 工程
    与服务提供方 Maven工程类似,需添加相关 Maven 依赖:

    <parent>
    <artifactId>Service1</artifactId>
    <groupId>com.itheima.nacos</groupId>
    <version>1.0‐SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>service‐1‐server</artifactId>
    <dependencies>
    <dependency>
    <groupId>com.itheima.nacos</groupId>
    <artifactId>service‐1‐api</artifactId>
    <version>1.0‐SNAPSHOT</version>
    </dependency>
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring‐cloud‐starter‐alibaba‐nacos‐config</artifactId>
    </dependency>
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring‐cloud‐starter‐alibaba‐nacos‐discovery</artifactId>
    </dependency>
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring‐cloud‐starter‐dubbo</artifactId>
    </dependency>
    </dependencies>
    

    (2)实现 Dubbo 服务

    package com.itheima.microservice.service1.service;
    @org.apache.dubbo.config.annotation.Service
    public class ConsumerServiceImpl implements ConsumerService {
    @Override
    public String service() {
    return "Consumer invoke " ;
    }
    }
    

    注意:使用@org.apache.dubbo.config.annotation.Service标记dubbo服务

    (3)配置 Dubbo 服务
    Service2 作为Dubbo服务消费方配置与服务提供方类似,注意,service1不仅是消费方,同时还是服务提供方:

    server:
      port: ${port:56030} #启动端口 命令行注入
    
    spring:
      application:
        name: service1
      main:
        allow‐bean‐definition‐overriding: true # Spring Boot 2.1 需要设定
      cloud:
        nacos:
          discovery:
            server‐addr: 127.0.0.1:8848
            namespace: c67e4a97‐a698‐4d6d‐9bb1‐cfac5f5b51c4
            cluster‐name: DEFAULT
          config:
            server‐addr: 127.0.0.1:8848 # 配置中心地址
            file‐extension: yaml
            namespace: c67e4a97‐a698‐4d6d‐9bb1‐cfac5f5b51c4 # 开发环境
            group: NACOS_MICROSERVICE_GROUP # xx业务组
    
    dubbo:
      scan:
        # dubbo 服务扫描基准包
        base‐packages: com.itheima.microservice
      protocol:
        # dubbo 协议
        name: dubbo
        # dubbo 协议端口
        port: ${dubbo_port:20881}
      registry:
        address: nacos://127.0.0.1:8848
      application:
        qos‐enable: false #dubbo运维服务是否开启
      consumer:
        check: false #启动时就否检查依赖的服务
    

    以上 YAML 内容,dubbo开头的为dubbo服务 的配置:

    • dubbo.scan.base-packages : 指定 Dubbo 服务实现类的扫描基准包,将
      @org.apache.dubbo.config.annotation.Service注解标注的service暴露为dubbo服务。
    • dubbo.protocol : Dubbo 服务暴露的协议配置,其中子属性 name 为协议名称, port 为dubbo协议端口可以指定多协议,如:dubbo.protocol.rmi.port=1099
    • dubbo.registry : Dubbo 服务注册中心配置,其中子属性 address 的值 "nacos://127.0.0.1:8848",说明dubbo服务注册到nacos

    相当于原生dubbo的xml配置中的 <dubbo:registry address="10.20.153.10:9090" />

    上半部分为SpringCloud的相关配置:

    • spring.application.name : Spring 应用名称,用于 Spring Cloud 服务注册和发现。
      该值在 Dubbo Spring Cloud 加持下被视作 dubbo.application.name ,因此,无需再显示地配置dubbo.application.name
    • spring.cloud.nacos.discovery : Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
    • spring.cloud.nacos.config : Nacos 配置中心配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口。

    (4)启动服务消费方应用

    @SpringBootApplication
    @EnableDiscoveryClient
    public class Service1Bootstrap {
    public static void main(String[] args) {
    SpringApplication.run(Service1Bootstrap.class, args);
    }
    }
    

    当 Service1Bootstrap 启动后,应用 service1 将出现在 Nacos 控制台界面。
    启动成功,观察nacos服务列表


    QQ截图20200103093624.png

    相关文章

      网友评论

          本文标题:Nacos - 服务发现(4.1)

          本文链接:https://www.haomeiwen.com/subject/uglzoctx.html