扫码阅读
手机扫码阅读

云原生丨手把手教你搭建自己的第一个微服务

237 2023-09-22


Cloud Native

ESG服务BU云原生交付中心、云基地

在云原生上的尝试、调研与分享



本期内容

微架构搭建全过程

我们知道,微服务架构是把项目里的每一个功能元素独立出来,再对这些功能元素进行动态组合。这样的优点在于:节省调用资源,使之成为可独立升级的代码块。

微服务把服务拆分成一个个模块,使得其界限相对明显,从而实现项目的可理解性、可测试性以及可观测性,同时降低项目解耦(高内聚,低耦合)的复杂性。

随着系统复杂度的提升,以及对系统扩展性的要求越来越高,微服务化是一个很好的方向。

本期我们就为大家详细讲解一下微服务框架的搭建过程。我们将结合神州数码云基地的微服务相关项目,手把手教大家搭建自己第一个微服务。

一、环境准备

软件要求

这里主要讲的是构建微服务框架时的前期准备工作,主要是环境的准备。包括了 JDK 的版本、IEDA 的版本和Maven 的版本等。

  • JDK 1.8

  • IEDA 2019(推荐)

  • Maven 3.5.x(推荐)

  • nacos 1.1.3(推荐)

在这里要注意一点,IDEA 版本与 Maven 的版本需要进行适配。

如 IDEA2019.1 与 Maven3.5.x 系列的适配度较高,Maven 的版本不宜太高。

这样的话在 IDEA的ieda.log 里可能会报" Unable to create injector "的错。直接导致不能拉取框架或者 Maven 的 Plugins 下载报错等问题。

配置操作

这里主要讲的是一些配置的相关操作,包括了 Maven 的 settings.xml 配置、IDEA 的 settings 配置以及 Nacos的配置等。

# Maven 的 settings.xml 配置:

框架在云基地的 nexus3 私服上面,需要在这上面进行拉取 ⬇

"1.0" encoding="UTF-8"?>"http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> 你的本地仓库路径     DCone 你的ITCODE 你的密码      DCone * https://nexus.dev.wh.digitalchina.com/repository/maven-public/     DCone  true    DCone https://nexus.dev.wh.digitalchina.com/repository/maven-public/  true   true      jdk-1.8  true 1.8   1.8 1.8 1.8   

# Nacos 的配置

1、安装 Nacos

基础框架使用 Nacos 为注册中心,所以第一步就是安装 Nacos 注册中心。

官方安装文档:https://nacos.io/zh-cn/docs/quick-start.html

下载对应的安装包:https://github.com/alibaba/nacos/releases

推荐下载1.3.1版本的,1.3.2启动报错,然后解压Linux:

$ unzip nacos-server-$version.zip#或者$ tar -xvf nacos-server-$version.tar.gz$ cd nacos/bin

2、Linux/Unix/Mac 运行

启动/关闭命令(standalone 代表着单机模式运行,非集群模式):

$ sh startup.sh -m standalone$ sh shutdown.sh # 后台运行$ nohup startup.sh -m standalone & # 如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:$ bash startup.sh -m standalone

3、Windows 运行

启动/关闭命令:

$ cmd startup.cmd$ cmd shutdown.cmd

或者双击 startup.cmd/shutdown.cmd 运行文件。

· Windows 后台运行的方法

在 nacos/bin 目录创建一个 nacosStartUp.vbs 文件,右键编辑:

CreateObject("WScript.Shell").Run "startup.cmd",0,FALSE

关闭也是同理,在 nacos/bin 目录创建 nacosShutDowm.vbs:

CreateObject("WScript.Shell").Run "shutdowm.cmd",0,FALSE

双击 nacosStartUp.vbs 文件启动 nacos 注册中心;

双击 nacosShutDowm.vbs 关闭 nacos 注册中心;

安装启动后,访问地址http://127.0.0.1:8848/nacos,账号密码均默认为nacos;

启动成功之后,就说明这个注册中心已经搭建好了。

4、1.3.2版本出错解决办法

问题一db.num is null --数据库有问题

解决办法:

  • mysql 新建库:nacos,字符集:utf8 ,排序规则:utf8_general_ci;

  • nacos/conf/nacos-mysql.sql 文件里的 sql 脚本执行到本机数据库的 nacos 库中;

  • nacos/conf/application.properties 里修改配置;

#*************** Config Module Related Configurations ***************#### If use MySQL as datasource:spring.datasource.platform=mysql ### Count of DB:db.num=1 ### Connect URL of DB:db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTCdb.user=rootdb.password=123456

问题二:unable to start web server --无法启动内置的 tomcat

解决办法:将 nacos/target/nacos-server.jar 拷贝到自己的 tomcat 目录下启动。

# IDEA 的 settings 配置:

二、拉取框架

框架的拉取主要是通过引入在云基地的 Nacos 注册中心。

其地址在 Maven 文件夹下的 conf 文件夹中,文件名为 settings.xml,推荐使用 IED 打开(如 VsCode )。具体的本地文件路径和镜像地址、仓库地址如下图2-1、2-2和2-3所示:

/ 图2-1 settings.xml本地文件路径

/ 图2-2 镜像地址

/ 图2-3 仓库地址

三、模块搭建

SDK模块

SDK 模块的内容不需要继承父模块的内容,所以不需要暴露框架的 parent 标签。

但是每个模块的 pom.xml 都必须要有自己的 groupId 坐标,因为删除了 parent 标签,所以需要自己手动加入 groupId 和 artifactId。

同时在SDK 模块中引入 lombok 依赖和 swagger 注解,方便写请求体和返回体的类。具体可参考图3-1与3-2所示:

/ 图3-1 手动加入坐标

/ 图3-2 引入注解

SDK-Cloud 模块

SDK-Cloud  模块是内部模块,所以保留 parent 标签。

它的作用主要是暴露给内部的其它服务去调用。且由于模块的引用方式是层层引用的,所以 SDK-Cloud  模块需要引用 SDK 模块。

同时,无论子模块中是否继承了父模块的依赖,都需要在父模块的 dependencies 中 对子模块的版本进行声明,表明子模块的版本跟随的是项目版本,使得两者版本保持一致,便于管理。具体可参考图3-3所示:

/ 图3-3 保留 parent 标签

同时,在每个新建的子模块中都需要声明该模块引用上一层的模块。

比如 sdk-cloud 模块引用的就是 SDK 模块,写在 Dependencies 中即可。具体可参考图3-4所示:

/ 图3-4 引用 SDK 模块

在 SDK-Cloud 模块中,需要对 Feign 做一些配置,Feign 是微服务之间进行远程调用的重要组件。

一般而言,哪个服务需要用到 Feign 哪个服务就会去写 Feign。

具体操作是在 SDK-Cloud的 resources 下注入 Spring factories 文件,来声明 Feign 的配置在其它模块也能够生效。具体可参考图3-5所示:

/ 图3-5 Feign的配置

common模块

common 模块是整个服务的核心,主要对数据进行处理,与业务的逻辑无关。作为内部的核心模块,依然保留 parent 标签,且需要引用上一层模块,在这里就不赘述了。

下面展示一下它的目录结构,具体如图3-6所示:

/ 图3-6 common目录结构

其中 PersonMapper 是作为接口,直接继承封装好的框架内容(BaseMapper),泛型是 Person 类。

主要的作用是对数据库进行持久化操作,有直接针对数据库的一些代码。具体如图3-7所示:

/ 图3-7 PersonMapper 接口

Person 作为数据库表的实体类,主要的作用是定义字段,自动生成 getter 和 setter,再加入 swagger 注解进行声明以及生成 setter 时返回类。具体如图3-8所示:

/ 图3-8 实体类

API模块

程序的入口(启动类)写在 API 模块中,Java 程序的入口是 main 函数,Spring Boot 的配置文件也写在该模块中。

由于项目采用的是多模块的方式,在启动类中声明 Service 注解或者 Component 注解,表明该类为 Spring 容器中的一个组件。

注意在多模块的项目中,包扫描( basePackages)的作用是在指定的路径下,扫描到 Service 注解(或 Component 注解)所修饰的类,注入到 spring 容器中。具体如图3-9所示:

/ 图 3-9 人员接口

在 API 模块中还需要声明与 Mybatis 有关的注解,在包扫描中指定 mapper 的路径(在 common 模块中)。具体如图3-10所示:

/ 图 3-10 相关注解

项目直接使用 main 函数作为程序的入口,但是由于框架对启动类做了一定程度上的封装,所以选择 extends 直接继承框架。具体如图3-11所示:

/ 图 3-11 程序入口

由于框架中使用 Discovery 模块后,在启动类中会存在一些问题,所以选择在 Nacos 配置中心使用 Spring Cloud的一个组件。

该组件的配置文件名为 bootstrap.yml,其被执行的优先级稍高于启动类,该文件对 Nacos 的一些配置做了封装。

一般的 SpringBoot 项目启动后只需要通过端口去访问,在本项目中还需加入变量前缀,该 yml 文件中还包含了mysq l数据库一些性能调优的信息。

/ 图3-12 相关端口信息

至此,服务的框架基本搭建完毕。

以上就是微服务框架搭建的内容,感兴趣的宝子们,赶紧去试试吧~

你的第一个微服务框架教程已送达

大家可以上手操作一下

如果你有更好的办法或疑问请

欢迎加入社群一起讨论哦⬇

原文链接: http://mp.weixin.qq.com/s?__biz=Mzg5MzUyOTgwMQ==&mid=2247518723&idx=1&sn=6ca9b65a83f962d952cb1780455d7f36&chksm=c02fb1a5f75838b396aba782036f6d9de2a3ed016b7947370af5098b2bd98c390d3634b8e0dd#rd