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

news2024/12/26 14:36:10

文章目录

  • 前言
  • 一、环境准备
    • 软件要求
    • 配置操作
  • 二、拉取框架
  • 三、模块搭建
    • ·SDK模块
    • ·SDK-Cloud 模块
    • ·common模块
    • ·API模块


前言

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

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

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

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


一、环境准备

软件要求

这里主要讲的是构建微服务框架时的前期准备工作,主要是环境的准备。包括了 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 私服上面,需要在这上面进行拉取 ⬇


<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="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">
    <localRepository>你的本地仓库路径</localRepository>
  <pluginGroups></pluginGroups>
    <proxies></proxies>
  <servers>
    <server>
            <id>DCone</id>
            <username>你的ITCODE</username>
            <password>你的密码</password>
        </server>
  </servers>
  
    <mirrors>
    <mirror>
            <id>DCone</id>
            <mirrorOf>*</mirrorOf>
            <url>https://nexus.dev.wh.digitalchina.com/repository/maven-public/</url>
        </mirror>
    </mirrors>
    <profiles>
    <profile>
            <id>DCone</id>
      <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <repositories>
                <repository>
                    <id>DCone</id>
          <url>https://nexus.dev.wh.digitalchina.com/repository/maven-public/</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
            </repositories>
        </profile>
    <profile>
            <id>jdk-1.8</id>
            <activation>
                <activeByDefault>true</activeByDefault>
                <jdk>1.8</jdk>
            </activation>
            <properties>
                <maven.compiler.source>1.8</maven.compiler.source>
                <maven.compiler.target>1.8</maven.compiler.target>
                <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
            </properties>
        </profile>
    </profiles>
</settings>
  • 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=UTC
db.user=root
db.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-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所示:

在这里插入图片描述

其中 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://www.coloradmin.cn/o/192895.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Springboot搭建java项目(三十一)—— 什么是Docker

什么是Docker 一、容器技术 1、应用程序的部署问题 ​ 还原应用程序部署的场景&#xff0c;开发在开发应用的时候&#xff0c;要自己搭建一套环境&#xff0c;进行本地调试&#xff0c;这时就需要在本地搭建一套JVM&#xff0c;NODE&#xff0c;NGNIX等一些应用程序运行的环…

【大唐杯备考】——5G系统勘察设计(学习笔记)

&#x1f4d6; 前言&#xff1a;本期介绍5G系统勘察设计。 目录&#x1f552; 1. 概述&#x1f558; 1.1 5G网络预规划&#x1f564; 1.1.1 5G建网需求确认&#x1f564; 1.1.2 4G现网评估&#x1f564; 1.1.3 站点规模估算&#x1f564; 1.1.4 5G仿真评估&#x1f558; 1.2 5G…

新年首捷 | 全息网御入选《CCSIP 2022中国网络安全产业全景图(第五版)》

2023年2月1日&#xff0c;FreeBuf咨询正式发布 《CCSIP&#xff08;China Cyber Security Panorama&#xff09;2022 中国网络安全行业全景册&#xff08;第五版&#xff09;》&#xff0c;旨在帮助企业更好地了解中国网络安全技术与市场的发展趋势&#xff0c;并为企业安全建设…

Python接口测试实战5(下) - RESTful、Web Service及Mock Server

本节内容REST及RESTful APIWeb ServiceXML解析Mock ServerREST及RESTful APIREST&#xff1a;表述性状态转移或表现层状态转移&#xff0c;“表现”及每个接口地址(URI)都表现为&#xff08;视为&#xff09;一个资源对象&#xff08;文本资源、图片资源、服务资源&#xff09;…

请问软件设计师、网络工程师、软件评测师还是系统集成项目管理师,哪个好考?

软件设计师、网络工程师、软件评测师还是系统集成项目管理师&#xff1f;这些都是属于软考中级科目&#xff0c;看自己是想从事哪个方向咯。都可以备考啊&#xff0c;毕竟含金量都差不多的&#xff01; 因为自己备考的是网工&#xff0c;就说说网工的备考如何吧 一、中级网络…

Quest Pro降价和Vive XR Elite之我见

本来没打算写Vive XR Elite&#xff0c;作为HTC首个支持VST透视的VR头显&#xff0c;它也引起了业内关注&#xff0c;尤其是去年10月份Meta Quest Pro重磅发布之后&#xff0c;大家就会看到&#xff0c;领域内的玩家都在朝着VST发力。那为什么现在来写Vive XR Elite呢&#xff…

即时通讯开发之TCP/IP中的TCP 协议概述

终于看到了 TCP 协议,这是 TCP/IP 详解里面最重要也是最精彩的部分,要花大力气来读。前面的 TFTP 和 BOOTP 都是一些简单的协议,就不写笔记了,写起来也没啥东西。 TCP 和 UDP 处在同一层---运输层,但是 TCP 和 UDP 最不同的地方是,TCP 提供了一种可靠的数据传输服务,TCP 是面向…

从零开始手写基于Web Components组件

前言 本文将详细讲解如何用最基本的typescript&#xff0c;vite&#xff0c;less构建基于Web Components的组件&#xff0c;目前已实现Button&#xff0c;Icon&#xff0c;Image&#xff0c;Tabs&#xff0c;Input&#xff0c;Message组件。首先介绍项目的整体架构&#xff0c…

新C++(6):继承那些事儿

"你在酒杯还未干的时间里&#xff0c;收藏这份情谊"一、回顾继承什么是继承&#xff1f;继承是面向对象编程语言的三大特征之一。通过继承机制&#xff0c;面向对象的程序设计可以很大限度地对代码进行复用。它允许程序员在保持原有类特性的基础上进行扩展&#xff0…

scrapy_redis概念作用和流程

scrapy_redis概念作用和流程 学习目标 了解 分布式的概念及特点了解 scarpy_redis的概念了解 scrapy_redis的作用了解 scrapy_redis的工作流程 在前面scrapy框架中我们已经能够使用框架实现爬虫爬取网站数据,如果当前网站的数据比较庞大, 我们就需要使用分布式来更快的爬取数…

制药行业中各种化合物的净化,大孔吸附净化氨基酸

基于吸附功能的聚苯乙烯特种树脂 Tulsimer ADS-600 是一款没有离子官能基的&#xff0c;由交联聚苯乙烯合成的功能强大的吸附型树脂。 Tulsimer ADS-600 主要应用于水溶液中吸附酚及其化合物&#xff0c;氯代烃等含氯物质&#xff0c;表面活性剂&#xff0c;氨基酸&#…

【C++修炼之路】C++入门(中)—— 函数重载和引用

&#x1f451;作者主页&#xff1a;安 度 因 &#x1f3e0;学习社区&#xff1a;StackFrame &#x1f4d6;专栏链接&#xff1a;C修炼之路 文章目录一、前言二、函数重载1、重载规则2、函数名修饰规则三、引用1、区分2、本质3、特性4、应用a、做参数b、做返回值5、效率比较6、常…

windows安装cnpm

文章目录1 cnpm简介2 cnpm 安装步骤1 cnpm简介 npm下载速度比较慢&#xff0c;可以通过cnpm下载node包 2 cnpm 安装步骤 找到nodejs的安装路径&#xff1a; 使用nvm安装和管理node 直接安装node的方式 直接通过安装包安装node的方式&#xff0c;node会被安装在某个实际目录下…

docker pull nginx

取最新版的 Nginx 镜像 docker pull nginx:latest 查看本地镜像 使用以下命令来查看是否已安装了 nginx&#xff1a; $ docker images 运行容器 安装完成后&#xff0c;我们可以使用以下命令来运行 nginx 容器&#xff1a; $ docker run --name nginx-door -p 8080:80 -…

VS code的使用指南

VS code的使用指南 VS code的安装与下载 VS Code的安装地址的 在下面选择版本的位置进行安装&#xff08;一般选择Stable进行安装&#xff0c;这个软件是跨系统的安装与设置相关的内容信息&#xff09;。 插件安装 直接点击这个位置,选择自己需要的相应的插件 这些都是常用的…

软件工程(四)——结构化设计、模块独立性、面向对象设计、软件测试与维护

目录 一、界面设计 二、结构化设计 1.概要设计 2模块独立性 三、面向对象设计 1.面向对象设计的五大基本原则(SOLID)和其他5个原则 2.设计模式 三、软件测试与维护 1.白盒测试和黑盒测试 2.测试的阶段 3.软件维护阶段 四、系统演化策略 一、界面设计 人机界面设计&…

50条必背JAVA知识点(一)

1.编写&#xff1a;编写的Java代码保存在以“.java”结尾的源文件中。 2.编译&#xff1a;使用javac.exe命令编译java源文件&#xff0c;生成字节码文件。格式&#xff1a;javac 源文件名.java 3.运行&#xff1a;使用java.exe命令解释运行字节码文件。格式&#xff1a;java …

深入浅出PyTorch-PyTorch的主要组成模块

目录1.基本配置2.数据读入3.模型构建3.1神经网络的构造3.2神经网络中常见的层常见网络层的构造常见的网络层3.3模型示例卷积神经网络&#xff08;LeNet&#xff09;深度卷积神经网络&#xff08;AlexNet&#xff09;4.模型初始化5.损失函数6.训练和评估深度学习和机器学习在流程…

python小游戏——塔防小游戏代码开源

♥️作者&#xff1a;小刘在这里 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放&#xff0c;愿所有的美好&#…

TCP/IP网络编程——优雅的断开套接字的连接

完整版文章请参考&#xff1a; TCP/IP网络编程完整版文章 文章目录第 7 章 优雅的断开套接字的连接7.1 基于 TCP 的半关闭7.1.1 单方面断开连接带来的问题7.1.2 套接字和流&#xff08;Stream&#xff09;7.1.3 针对优雅断开的 shutdown 函数7.1.4 为何要半关闭7.1.5 基于半关闭…