快速开始
本章节以IDEA引入NUWA依赖方式为例,介绍如何开发一个NUWA项目,带您体验工程创建、代码编写、调试运行的全过程。
操作步骤
- 创建工程目录
- 创建一个Maven空工程。
- 打开IntelliJ IDEA,选择“File > New > Project”。
图1 创建Maven工程
- 根据界面提示,一步步单击“Next”,即可成功创建一个基础的Maven工程。
- 打开IntelliJ IDEA,选择“File > New > Project”。
- 改变Maven的JDK版本。
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>
- 补全NUWA目录。
- 业务资源文件目录: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所示。
- 创建一个Maven空工程。
- 引入NUWA
- 手动导入SDK jar包。
- 在项目目录下新建一个lib目录,存放jar包。
- 将本地的jar包复制粘贴至lib目录下。
- 将jar包导入到项目中。
- 选择“File > Project Structure > Project Settings > Module”。
- 单击“+”,选择“JARs or Directories...”。
- 选中jar包,单击“apply”。导包完成。
- 依赖管理
在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>
- 依赖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启动时并不是必须的,即使删除掉,也能正常运行。但部署到服务器运行后,该配置则是必需的。
- 选择一个日志模块
日志模块可以选择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>
- 配置日志文件
在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。
- 手动导入SDK jar包。
- 开发微服务
- 微服务原理
图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>
- 微服务原理
- 启动NUWA
- 设置启动参数
设置启动类: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 本地调试启动参数设置 - 测试服务
执行Run,启动成功后,会输出如图5所示的一段内容。
通过浏览器访问服务:
图6 接口访问成功
- 设置启动参数