更新时间:2024-04-18 GMT+08:00
分享

快速开始

本章节以IDEA引入NUWA依赖方式为例,介绍如何开发一个NUWA项目,带您体验工程创建、代码编写、调试运行的全过程。

操作步骤

  1. 创建工程目录

    1. 创建一个Maven空工程。
      1. 打开IntelliJ IDEA,选择“File > New > Project”。
        图1 创建Maven工程
      2. 根据界面提示,一步步单击“Next”,即可成功创建一个基础的Maven工程。
    2. 改变Maven的JDK版本。

      修改pom.xml文件中的配置。

      <properties>
      	<maven.compiler.source>8</maven.compiler.source>
      	<maven.compiler.target>8</maven.compiler.target>
      	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      </properties>
    3. 补全NUWA目录。

      Maven默认的资源文件目录如下:

      • 业务资源文件目录:src/main/resources。
      • 测试资源文件目录:src/test/resources。

      默认资源文件目录中的文件也会被打包到jar包中,建议再增加一个src/main/config目录用于存放不打包为jar包的配置文件。

      一般会将Spring的配置文件、SPI扩展的配置文件等打包到jar包中,其它的日志配置文件、业务properties、yaml配置文件等专门放在一个配置目录里。

      在pom.xml里将src/main/config目录设置为资源文件目录(相当于classpath路径)。

      <build>
        <resources>
          <resource>
            <directory>src/main/config</directory>
          </resource>
          <resource>
            <directory>src/main/resources</directory>
          </resource>
        </resources>
      </build>

      最后,工程结构如图2所示。

      图2 补全目录之后的工程目录结构

  2. 引入NUWA

    1. 手动导入SDK jar包。
      1. 在项目目录下新建一个lib目录,存放jar包。
      2. 将本地的jar包复制粘贴至lib目录下。
      3. 将jar包导入到项目中。
        1. 选择“File > Project Structure > Project Settings > Module”
        2. 单击“+”,选择“JARs or Directories...”
        3. 选中jar包,单击“apply”。导包完成。
    2. 依赖管理

      在pom.xml增加dependencyManagement节点,管理依赖的软件版本。nuwa-dependencies这个pom可以管理所有依赖NUWA的版本。

      <dependencyManagement>
      	<dependencies>
      		<dependency>
      			<groupId>com.huawei.wisecloud.nuwa</groupId>
      			<artifactId>nuwa-dependencies</artifactId>
      			<version>3.0.19.101</version>
      			<type>pom</type>
      			<scope>import</scope>
      		</dependency>
      	</dependencies>
      </dependencyManagement>
    3. 依赖CSE模块

      CSE是开发微服务的基础模块。编辑pom.xml,以provided的方式引入nuwa-cse-foundation模块,provided表示在打包的时候,这些jar包都不会打入到业务包,而是由NUWA安装包提供。此处无需配置版本号,上一步引入的NUWA依赖管理,已经对所有NUWA的包的版本进行了约束管理。

      <dependency>
        <groupId>com.huawei.wisecloud.nuwa</groupId>
        <artifactId>nuwa-cse-foundation</artifactId>
        <scope>provided</scope>
      </dependency>

      另外,增加config/nuwa.boot.properties文件,并在该文件中,增加如下配置:

      nuwa.system.module.loadingList=nuwa-cse-foundation

      该配置有时候在IDEA启动时并不是必须的,即使删除掉,也能正常运行。但部署到服务器运行后,该配置则是必需的。

    4. 选择一个日志模块

      日志模块可以选择logback或log4j2,依然在pom里引入。此处以logback为例:

      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.4.8</version>
        <exclusions>
      	<exclusion>
      	  <groupId>org.slf4j</groupId>
      	  <artifactId>slf4j-api</artifactId>
      	</exclusion>
        </exclusions>
      </dependency>
    5. 配置日志文件

      在src/main/config目录下创建一个logback.xml文件,示例如下:

      <?xml version="1.0" encoding="UTF-8"?>
      
      <configuration scan="true" scanPeriod="120 seconds" debug="false">
          <appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="demo_appender">
              <encoder>
                  <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level-%msg%n</pattern>
              </encoder>
      
              <file>${LOG_HOME}/demo.log</file>
      
              <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
                  <FileNamePattern>${LOG_HOME}/demo-%i.log.gz</FileNamePattern>
                  <minIndex>1</minIndex>
                  <maxIndex>20</maxIndex>
              </rollingPolicy>
      
              <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                  <maxFileSize>50MB</maxFileSize>
              </triggeringPolicy>
          </appender>
          <logger name="com.huawei.demo" additivity="false" level="INFO">
              <appender-ref ref="demo_appender"/>
          </logger>
      
          <root level="INFO">
              <appender-ref ref="demo_appender"/>
          </root>
      </configuration>

      默认环境变量LOG_HOME=/opt/huawei/logs/${模块名称}。

      业务可以修改该路径,业务自定义日志配置,可以引用该环节变量。

      内置中间件绕接规则是根据日志大小50M,保留20个,建议业务至少预留日志磁盘大小20G。

  3. 开发微服务

    • 微服务原理
      图3 注册中心使用流程

      Producer是服务提供方,Consumer是服务调用方。Consumer本身也可以是服务提供方,Producer也可以再去调用别的微服务。 从而形成一个微服务调用网。

      Producer会提供http接口,Producer会把自己的服务名注册到注册中心。Consumer从注册中心获取服务名对应的机器列表,然后再发http请求去调用。 当然这个调用过程是CSE封装的。

      CSE微服务也可以不接入注册中心,作为一个纯粹的http服务对外提供。

    • 增加微服务配置文件

      在src/main/config目录下创建一个microservice.yaml文件。

      APPLICATION_ID: demo      #'#服务名'
      service_description:
        name: demoService      # '#微服务名'
        version: 0.0.1
      cse:
        rest:
          address: 127.0.0.1:8081

      文件定义了服务名称,监听端口,以及接口版本号,没有配置“服务注册中心”,如果有多个微服务,需要相互调用,可能需要搭建一个服务注册中心,一般本地开发不需要注册中心。

    • 定义一个服务类(业务自定义功能实现),示例代码如下:
      package com.huawei.demo;
      
      import org.apache.servicecomb.provider.rest.common.RestSchema;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RequestMethod;
      
      import javax.ws.rs.QueryParam;
      
      @RestSchema(schemaId = "test")
      @RequestMapping(path = "/")
      public class DemoService {
          @RequestMapping(path = "/hello",method = RequestMethod.GET)
          public String sayHello(@QueryParam(value = "name") String name) {
              return "hello"+ name;
          }
      }

      RestSchema是一个CSE接口的标识,CSE通过这个注解找到所有的服务类,每个服务类的schemaId不同。

      CSE是实现了对Spring MVC注解的支持,但是它本身并不是Spring MVC,很多Spring MVC的功能无法使用。

    • 配置Spring文件

      CSE和NUWA都是基于Spring开发的,业务定义的服务类如果被CSE发现,则会交给Spring管理。

      NUWA启动原理是通过加载classpath*:META-INF/spring/*.xml以及classpath*: spring/*.xml下面的Spring文件把Spring容器拉起来。

      可以增加一个src/main/resources/META-INF/spring/demo-spring.xml文件,将服务类加进去。

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans
      		http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
          <context:component-scan base-package="com.huawei.nuwa.demo" />
      </beans>

  4. 启动NUWA

    1. 设置启动参数

      设置启动类:com.huawei.nuwa.boot.loader.NuwaClassPathLauncher

      VM启动参数:-Dlocal.registry.file=notExistJustForceLocal

      本地调试或者不需要调用其它微服务,可以指定不使用注册中心。

      该参数表示没有注册中心,如果不配置该参数,启动以后默认会连127.0.0.1:30100作为注册中心地址。连不上注册中心,就不会对外提供服务。

      请勾选“Include dependencies with Provided scope”。默认IDEA是不加载provided领域下的jar包的。

      图4 本地调试启动参数设置
    2. 测试服务

      执行Run,启动成功后,会输出如图5所示的一段内容。

      图5 启动成功标志

      通过浏览器访问服务:

      图6 接口访问成功

分享:

    相关文档

    相关产品