微服务圣经1:零基础搭建一套SpringCloud微服务脚手架(SpringCloud+Dubbo+Docker+Jenkins)

news2024/11/19 12:40:25

说在前面

在40岁老架构师尼恩的读者社群(50+)中,大量的小伙伴是架构师、高级开发,大家都有丰富的开发、架构经验。

在开发过程中,一般情况下,大家都是用现有的开发框架。

导致的一个严重问题是:很少有小伙伴能从0开始 搭建一套SpringCloud微服务脚手架(SpringCloud+ Dubbo + Docker + Jenkins)。然而,零基础 搭建一套SpringCloud微服务脚手架(SpringCloud+ Dubbo + Docker + Jenkins),这个实操对大家来说,至关重要

尼恩一直在找一个契机,给大家梳理一个《零基础 搭建一套SpringCloud微服务脚手架》 博客。提升大家的实操能力,动手能力。

直到今天、契机终于来了。

从2020年开始,尼恩一直在写一本 微服务架构和开发领域的 至尊宝典 《SpringCloud 学习圣经》,全量的博客加起来全网阅读量在100W+。在这么大访问量的激励下,尼恩一直在对这本 《SpringCloud 学习圣经》进行迭代。

而且由于尼恩一人有精力有限,在尼恩的《技术自由圈》 高并发研究社群中,不断吸取有志之士的加入。咱们社群中一位资深的、华中科技大学硕士、有着10年开发和架构经验、并且管理一个20人团队的架构师 Andy加入了咱们技术迭代、技术研究的队伍。

他来给大家提供了一个优秀的微服务 基础架构实操案例,《零基础 搭建一套SpringCloud微服务脚手架》。

这,就是本文。当然,本文也收入了咱们的 10W字 至尊宝典 《SpringCloud alibaba 学习圣经》最新升级版, 《SpringCloud alibaba 学习圣经》宝典从此升级到了V3版本。

最新的 PDF 文档,可以到文末 公众号【技术自由圈】 获取。

本文目录

文章目录

    • 说在前面
    • 本文目录
    • 1、本文学习内容和目标
    • 2、设计微服务框架的基本原则
      • 1.解耦和独立性:
      • 2.可伸缩性和容错性:
      • 3.简化开发和部署过程:
      • 4.兼容性和可扩展性:
    • 3、搭建基础设施
      • 1.安装Java开发环境
        • 工具介绍:
        • 下载地址:
        • 安装方式:
        • 操作示例:
      • 2.安装和配置Maven
        • 工具介绍:
        • 下载地址:
        • 安装方式:
        • 操作示例:
      • 3.安装和配置Git
        • 工具介绍:
        • 下载地址:
        • 安装方式:
        • 操作示例:
      • 4.安装集成开发环境(IDE)
        • 工具介绍:
        • 下载地址:
        • 安装方式:
        • 操作示例:
      • 5.创建项目和配置构建工具
    • 4、定义微服务接口和协议
      • 1.引入JPA依赖
      • 2.示例表结构
      • 3.application.yml配置
      • 4.定义学生实体类
      • 5.定义学生信息的持久化接口
      • 6.定义学生信息的控制器接口
    • 5、实现服务注册与发现
      • 1.安装和配置Nacos
      • 2.引入Nacos相关依赖
      • 3.系统配置变更
      • 4.示例代码
    • 6、实现服务调用和负载均衡
    • 7、实现服务监控和日志管理
      • 1.Spring Boot Admin 服务监控
      • 2.ELK 日志监控
      • ELK安装
      • 微服务应用接入
    • 8、保护服务安全
    • 9、实现持续集成和部署
      • 1.Jenkins
      • 2.Docker
      • 3.配置步骤
    • 10、小结
    • 技术自由的实现路径 PDF:
        • 实现你的 架构自由:
        • 实现你的 响应式 自由:
        • 实现你的 spring cloud 自由:
        • 实现你的 linux 自由:
        • 实现你的 网络 自由:
        • 实现你的 分布式锁 自由:
        • 实现你的 王者组件 自由:
        • 实现你的 面试题 自由:

1、本文学习内容和目标

微服务架构通过将复杂的单体应用拆分为一组小型、自治的服务,为构建灵活、可扩展的应用提供了一种新的方式。

微服务框架具有以下优势:

  • 模块化和可扩展性:微服务框架将应用程序拆分成多个独立的服务,每个服务可以独立开发、部署和扩展,提高了系统的灵活性和可伸缩性。
  • 技术多样性:微服务框架支持使用不同的技术栈和编程语言来构建不同的服务,使团队可以根据具体需求选择最合适的技术。
  • 高可用性和容错性:微服务框架通过服务注册与发现、负载均衡和容错机制,提供了高可用性和容错性,保证了系统的稳定性和可靠性。
  • 独立部署和快速迭代:每个服务可以独立部署,使团队可以快速迭代和发布新功能,提高了开发和交付的效率。

在构建微服务系统时,选择一个适合的框架可以加速开发过程并提高系统的稳定性和可维护性。

本文旨在通过手把手教程,引导读者从零开始搭建一套Java微服务框架。

我们将使用Spring Cloud作为基础框架,并结合Nacos作为服务注册中心,Spring Cloud Gateway作为API网关,以及Feign作为服务之间的通信方式。

此外,我们还将探讨如何使用Docker容器化和Jenkins进行持续集成和部署,以构建一个完整的微服务架构。

通过本文的学习,读者将掌握以下技能:

  • 设计和搭建微服务框架的基本原则
  • 配置和使用Spring Cloud、Nacos、Spring Cloud Gateway和Feign等关键组件
  • 实现服务注册与发现、服务调用和负载均衡、服务监控和日志管理、服务安全和认证授权等核心功能
  • 应用Docker容器化和Jenkins进行持续集成和部署

在开始构建自己的Java微服务框架之前,让我们先了解下设计微服务框架要遵守的一些基本原则。

2、设计微服务框架的基本原则

在设计微服务框架时,我们需要遵循一些基本原则,以确保系统的可扩展性、可维护性和可靠性。以下是设计微服务框架的基本原则:

1.解耦和独立性:

微服务架构的核心概念之一是服务的解耦和独立性。每个微服务应该具有清晰的边界,它们可以独立开发、部署和扩展。在设计框架时,要保证各个微服务之间的解耦,使其可以独立演化而不会对其他服务产生过多的影响。

2.可伸缩性和容错性:

微服务架构的另一个重要目标是实现可伸缩性和容错性。框架应该能够根据负载的增加或减少,自动扩展或缩减服务实例的数量。同时,要考虑到服务的容错能力,当某个服务出现故障时,框架应该能够自动将请求路由到其他可用的服务实例上。

3.简化开发和部署过程:

微服务框架应该能够简化开发和部署的过程。提供一套标准化的开发模式和工具链,使开发人员可以快速构建和部署微服务。自动化的构建、测试和部署流程能够提高开发效率,减少人为错误。

4.兼容性和可扩展性:

框架应该具备良好的兼容性和可扩展性,能够与其他技术和组件进行集成。例如,能够无缝地与现有的数据存储、消息队列、认证授权系统等进行整合。此外,框架本身也应该是可扩展的,可以根据需求灵活地添加新的功能模块。

设计微服务框架时,需要综合考虑这些原则,并根据实际情况进行权衡和取舍。合理的框架设计能够提高开发效率、降低系统复杂度,并为微服务架构的可持续发展打下坚实的基础。在后续的章节中,我们将深入探讨如何应用这些原则,结合Spring Cloud、Nacos、Spring Cloud Gateway、Feign等组件,构建一套高效可靠的Java微服务框架。

3、搭建基础设施

在搭建微服务框架之前,我们需要配置一些基础设施,包括Java开发环境、构建工具、版本控制和集成开发环境(IDE)。下面是一些常用的工具和配置:

1.安装Java开发环境

工具介绍:

首先,确保你的系统上已经安装了Java开发工具包,Java开发环境包括Java Development Kit(JDK),它是开发和运行Java应用程序所必需的工具包。

你可以从Oracle官方网站或OpenJDK项目中下载并安装最新版本的JDK。

安装完成后,设置JAVA_HOME环境变量,指向JDK的安装目录。

下载地址:

  • Oracle JDK: https://www.oracle.com/java/technologies/javase-jdk11-downloads.html
  • OpenJDK: https://adoptopenjdk.net/

安装方式:

  1. 根据你的操作系统选择合适的Java发行版。
  2. 下载安装程序并运行。
  3. 按照安装向导的指引完成安装。
  4. 配置JAVA_HOME环境变量:
    • Windows:在系统变量中新建一个名为JAVA_HOME的变量,值为JDK的安装路径(例如:D:\program\Java\jdk1.8.0_202)。
    • macOS/Linux:在终端中编辑~/.bashrc或~/.bash_profile文件,并添加以下行:export JAVA_HOME=/path/to/jdk。然后运行source ~/.bashrcsource ~/.bash_profile命令使配置生效。

操作示例:

  1. 打开命令行终端。
  2. 执行以下命令验证Java安装是否成功:
java -version
  1. 如果成功安装,会显示Java版本信息。

2.安装和配置Maven

工具介绍:

Apache Maven是一款流行的构建工具,用于管理Java项目的依赖和构建过程。你可以从Apache Maven官方网站下载Maven,并按照官方文档的指引进行安装和配置。配置完成后,确保你可以在命令行中使用mvn命令。

下载地址:

Maven官方网站:https://maven.apache.org/download.cgi

安装方式:

  1. 下载适用于你的操作系统的Maven二进制发行版(ZIP或tar.gz格式)。
  2. 解压下载的文件到你选择的目录。
  3. 配置MAVEN_HOME环境变量:
    • Windows:在系统变量中新建一个名为MAVEN_HOME的变量,值为Maven的安装路径(例如:C:\apache-maven-3.8.3)。
    • macOS/Linux:在终端中编辑~/.bashrc或~/.bash_profile文件,并添加以下行:export MAVEN_HOME=/path/to/maven。然后运行source ~/.bashrcsource ~/.bash_profile命令使配置生效。
  4. 将Maven的bin目录添加到系统的PATH环境变量中。

操作示例:

  1. 打开命令行终端。
  2. 执行以下命令验证Maven安装是否成功:
mvn -v
  1. 如果成功安装,会显示Maven版本信息。

3.安装和配置Git

工具介绍:

Git是一款分布式版本控制系统,常用于协作开发和代码管理。你可以从Git官方网站下载并安装Git客户端。安装完成后,通过命令行验证Git是否正确安装,并设置你的用户名和邮箱。

下载地址:

Git官方网站:https://git-scm.com/downloads

安装方式:

  1. 下载适用于你的操作系统的Git安装程序。
  2. 运行安装程序并按照安装向导的指引进行安装。
  3. 在安装过程中选择合适的选项,例如选择安装位置和默认编辑器。

操作示例:

  1. 打开命令行终端。
  2. 配置用户名和邮箱:
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
  1. 执行以下命令验证Git安装是否成功:
git --version
  1. 如果成功安装,会显示Git版本信息。

4.安装集成开发环境(IDE)

工具介绍:

推荐使用IntelliJ IDEA作为开发微服务的集成开发环境,IntelliJ IDEA是一款强大的Java集成开发环境,提供了丰富的功能和工具来开发Java应用程序。你可以从JetBrains官方网站下载并安装IntelliJ IDEA的社区版或旗舰版,一般社区版能满足基本的开发需要。安装完成后,打开IntelliJ IDEA,并根据需要进行相应的配置,例如选择主题、安装必要的插件等。

下载地址:

IntelliJ IDEA官方网站:https://www.jetbrains.com/idea/download/

安装方式:

  1. 下载适用于你的操作系统的IntelliJ IDEA安装程序。
  2. 运行安装程序并按照安装向导的指引进行安装。
  3. 在安装过程中选择合适的选项,例如选择安装位置、启动器图标等。

操作示例:

  1. 打开安装后的IntelliJ IDEA。
  2. 配置IntelliJ IDEA的插件和主题等个性化设置。

5.创建项目和配置构建工具

  1. 打开IntelliJ IDEA。
  2. 在欢迎界面中选择"Create New Project"或点击菜单栏的"File" -> “New” -> “Project”。
  3. 使用 Spring Initializr 快速生成项目结构,

输入名称,存储位置,jdk等信息,点击下一步

选择spring boot版本,选择所需依赖,点击创建

项目创建后,可以在pom.xml文件里继续配置依赖和构件项。

pom.xml示例如下:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.7.11</version>
    </dependency>

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2021.1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.0.1</version>
            <configuration>
                <encoding>UTF-8</encoding>
            </configuration>
            <executions>
                <execution>
                    <id>attach-sources</id>
                </execution>
            </executions>
        </plugin>
        <!--test case plugin-->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>3.0.0-M5</version>
            <configuration>
                <parallel>methods</parallel>
                <threadCount>10</threadCount>
                <argLine>-Dfile.encoding=UTF-8</argLine>
                <skipTests>true</skipTests>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.3.0</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

        <!--default package plugin-->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <fork>true</fork>
                <jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
                <addResources>true</addResources>
                <classifier>exec</classifier>
            </configuration>
        </plugin>
    </plugins>
</build>

以上是安装和配置Java、Maven、Git和IntelliJ IDEA的详细步骤。

请按照这些步骤进行操作,确保这些工具在你的开发环境中正确安装和配置。

接下来我们就可以继续进行下一步,开始搭建Java微服务框架。

4、定义微服务接口和协议

在设计微服务框架时,定义微服务接口和协议是非常重要的一步。

接下来以学生信息为例,结合JPA(Java Persistence API),提供相关的增删改查的代码示例。

JPA(Java Persistence API)是Java EE的一部分,是一种用于对象持久化的规范。

它提供了一种以面向对象的方式进行数据库操作的方式,通过简化数据库访问和数据对象之间的映射,提高了开发效率。

JPA使用注解来描述实体类和数据库表之间的映射关系,可以轻松地进行增删改查等常见数据库操作。它支持各种关系型数据库,并提供了事务管理、缓存等功能。

在我们的示例中,我们使用JPA来定义学生实体类,并通过注解来映射学生信息表的结构。这样,我们可以通过简单的代码操作来实现对学生信息的持久化和查询。

1.引入JPA依赖

在开始之前,我们需要在项目的pom.xml文件中添加JPA的依赖。JPA是Java Persistence API的缩写,它是Java EE中持久化操作的标准规范,用于简化数据库操作和实体对象的映射关系。

请在项目的pom.xml文件中添加以下依赖:

<dependencies>
    <!-- JPA -->
    <dependency>
        <groupId>javax.persistence</groupId>
        <artifactId>javax.persistence-api</artifactId>
        <version>2.2</version>
    </dependency>

    <!-- Hibernate JPA 实现 -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.6.0.Final</version>
    </dependency>

    <!-- 数据库驱动 -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.200</version>
    </dependency>
    
    <!-- Spring Boot Data JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <!-- 其他依赖... -->

</dependencies>

这些依赖将启用JPA和Hibernate作为我们的持久化框架,并使用H2数据库作为示例数据库。你可以根据自己的需求替换为其他数据库。

2.示例表结构

在我们的示例中,我们将使用一个名为"student"的表来存储学生信息。该表包含三个列:id(主键),name和age。

请确保在你的数据库中创建了名为"student"的表,以及相应的列。以下是表的DDL示例:

CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(50),
  age INT
);

3.application.yml配置

在项目中,我们需要配置application.yml文件来连接数据库和配置JPA。

请在src/main/resources目录下创建一个名为application.yml的文件,并添加以下内容:

server:
  port: 8180
  servlet:
    context-path: /
spring:
  application:
    name: students-service
  datasource:
    url: jdbc:h2:mem:test
    username: sa
    password: password
    driver-class-name: org.h2.Driver
  jpa:
    hibernate:
      ddl-auto: create
    show-sql: true

以上配置使用了H2内存数据库,并使用了默认的sa用户和password密码进行连接。同时,我们启用了Hibernate的DDL自动更新功能,并配置JPA显示SQL语句。

4.定义学生实体类

首先,定义一个学生实体类,用于表示学生的信息。可以包含学生的ID、姓名、年龄等属性。

import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
@Data
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    private int age;

}

5.定义学生信息的持久化接口

使用JPA来管理学生信息的持久化操作。定义一个学生信息的持久化接口,提供增删改查等方法。

import org.springframework.data.jpa.repository.JpaRepository;

public interface StudentRepository extends JpaRepository<Student, Long> {
    // 可以添加自定义的查询方法,如根据姓名查询学生信息等
}

6.定义学生信息的控制器接口

在微服务框架中,通过HTTP协议暴露学生信息的API接口供外部调用。定义一个学生信息的控制器接口,提供增删改查等API方法。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/students")
public class StudentController {
    @Autowired
    private StudentRepository studentRepository;

    @GetMapping
    public List<Student> getAllStudents() {
        return studentRepository.findAll();
    }

    @PostMapping
    public Student createStudent(@RequestBody Student student) {
        return studentRepository.save(student);
    }

    @GetMapping("/{id}")
    public Student getStudentById(@PathVariable("id") Long id) {
        return studentRepository.findById(id).orElse(null);
    }

    @PutMapping("/{id}")
    public Student updateStudent(@PathVariable("id") Long id, @RequestBody Student updatedStudent) {
        Student existingStudent = studentRepository.findById(id).orElse(null);
        if (existingStudent != null) {
            existingStudent.setName(updatedStudent.getName());
            existingStudent.setAge(updatedStudent.getAge());
            return studentRepository.save(existingStudent);
        }
        return null;
    }

    @DeleteMapping("/{id}")
    public void deleteStudent(@PathVariable("id") Long id) {
        studentRepository.deleteById(id);
    }
}

通过以上代码示例,我们定义了一个学生信息的实体类、学生信息的持久化接口和学生信息的控制器接口。

这样就可以通过API来进行学生信息的增删改查操作。

在接下来的步骤中,我们将结合Spring Cloud、Nacos、Spring Cloud Gateway、Feign、Docker和Jenkins等组件,搭建一个完整的Java微服务框架。

5、实现服务注册与发现

服务注册与发现是微服务架构中非常重要的一部分,它允许我们动态地注册和发现微服务实例,从而实现微服务之间的通信。在这一节中,我们将详细介绍服务注册与发现的工作原理和实现方式。

  1. 服务注册

服务注册是指将微服务实例的信息(例如主机名、端口号、服务名称等)注册到服务注册中心,使得其他服务可以发现和调用它。下面是服务注册的步骤:

  • 微服务启动时,它会向服务注册中心发送注册请求,提供自己的信息。
  • 服务注册中心收到注册请求后,将微服务的信息保存起来,并为其生成一个唯一的标识符(例如服务ID)。
  • 其他微服务可以通过服务注册中心查询和获取已注册的微服务实例列表。
  1. 服务发现

服务发现是指在需要调用其他微服务时,通过服务注册中心来获取可用的微服务实例信息。下面是服务发现的步骤:

  • 微服务需要调用其他服务时,它向服务注册中心发送发现请求,指定需要调用的服务名称。
  • 服务注册中心根据服务名称查询已注册的微服务实例列表,并返回给调用方。
  • 调用方根据负载均衡策略选择一个可用的微服务实例进行调用。
  1. 实现方式

服务注册与发现可以采用不同的实现方式,常见的有以下几种:

  • 基于服务注册中心的实现:使用独立的服务注册中心,例如Netflix Eureka、Consul或Nacos。微服务在启动时将自己注册到注册中心,其他微服务可以通过查询注册中心获取可用的微服务实例信息。
  • 基于DNS的实现:每个微服务使用自己的主机名和端口号,其他微服务通过域名解析来发现和调用它们。这种方式通常用于较小规模的微服务架构。
  • 基于边车代理的实现:使用边车代理(例如Zuul或Spring Cloud Gateway)来代理所有的微服务请求,并在代理层进行服务发现和负载均衡。

在实现服务注册与发现时,我们通常会使用专门的框架和工具来简化开发和管理。例如,结合Spring Cloud框架和Nacos注册中心,我们可以通过使用@EnableDiscoveryClient注解启用服务注册与发现功能,并通过配置中心来配置服务注册中心的地址。然后,我们可以通过注入DiscoveryClient来获取已注册的微服务实例列表,并根据需要进行调用。

通过服务注册与发现,我们可以实现微服务架构的弹性、可扩展和高可用性,使得微服务之间的通信更加灵活和可靠。

接下来,我们将使用Nacos作为服务注册与发现的中间件,并进行安装和配置。

Nacos(Naming and Configuration Service)是一个开源的服务注册与发现中间件,由阿里巴巴集团开发和维护。它提供了服务注册、发现、配置管理和动态配置更新的功能,可以帮助我们构建弹性可伸缩的微服务架构。

Nacos支持主流的服务注册和发现协议,如Eureka、Consul和Nacos自身的服务注册协议。它还提供了灵活的配置管理功能,支持动态配置刷新,可以帮助我们实现微服务的配置中心。

1.安装和配置Nacos

首先,我们需要安装Nacos Server。请按照以下步骤进行操作:

步骤 1:下载Nacos Server

你可以从Nacos的官方GitHub仓库下载最新版本的Nacos Server。

下载地址:https://github.com/alibaba/nacos/releases

步骤 2:解压Nacos Server

将下载的Nacos压缩文件解压到你选择的目录中。

步骤 3:启动Nacos Server

进入解压后的Nacos目录,执行以下命令启动Nacos Server:

PS D:\program\nacos\bin> .\startup.cmd -m standalone
"nacos is starting with standalone"

         ,--.
       ,--.'|
   ,--,:  : |                                           Nacos 2.2.2
,`--.'`|  ' :                       ,---.               Running in stand alone mode, All function modules
|   :  :  | |                      '   ,'\   .--.--.    Port: 8848
:   |   \ | :  ,--.--.     ,---.  /   /   | /  /    '   Pid: 16948
|   : '  '; | /       \   /     \.   ; ,. :|  :  /`./   Console: http://10.23.48.43:8848/nacos/index.html
'   ' ;.    ;.--.  .-. | /    / ''   | |: :|  :  ;_
|   | | \   | \__\/: . ..    ' / '   | .; : \  \    `.      https://nacos.io
'   : |  ; .' ," .--.; |'   ; :__|   :    |  `----.   \
|   | '`--'  /  /  ,.  |'   | '.'|\   \  /  /  /`--'  /
'   : |     ;  :   .'   \   :    : `----'  '--'.     /
;   |.'     |  ,     .-./\   \  /            `--'---'
'---'        `--`---'     `----'

2023-05-17 11:20:55,045 INFO Tomcat initialized with port(s): 8848 (http)

Nacos Server将在默认端口(8848)启动,并以单机模式运行。

步骤 4:访问Nacos控制台

在浏览器中访问以下地址,进入Nacos控制台:

http://10.23.48.43:8848/nacos

2.引入Nacos相关依赖

在开始之前,我们需要在项目的pom.xml文件中添加Nacos相关依赖。请添加以下依赖:

xmlCopy code<dependencies>
    <!-- Nacos Discovery -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2021.1</version>
        </dependency>

        <!-- spring cloud,基于spring cloud才会读取bootstrap.yml -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
    
    <!-- 其他依赖... -->
</dependencies>

以上依赖将引入Nacos服务注册与发现的功能。

3.系统配置变更

现在,我们需要进行一些系统配置变更,以便我们的微服务可以与Nacos进行交互。请在bootstrap.yml文件中添加以下配置:

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 10.23.48.43:8848

以上配置指定了Nacos Server的地址和端口。

4.示例代码

接下来,我们将编写示例代码,实现服务注册与发现的功能。请添加以下代码到Spring Boot应用程序中的启动类上方:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication
public class StudentsServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(StudentsServiceApplication.class, args);
    }
}

在以上代码中,我们使用了@EnableDiscoveryClient注解来启用服务注册与发现功能。

现在,你的微服务将能够与Nacos进行通信,实现服务的注册和发现。

在接下来的步骤中,我们将继续编写代码来实现其他功能,如服务网关、服务间通信等。

6、实现服务调用和负载均衡

在微服务架构中,服务之间的调用是非常常见的场景。为了简化服务调用的过程并实现负载均衡,我们可以使用Feign与Nacos结合来实现。本节将详细介绍服务调用的概念以及如何使用Feign与Nacos来实现服务调用和负载均衡。

  1. 服务调用的概念

服务调用是指一个微服务向另一个微服务发起请求,获取所需的数据或执行特定的操作。在微服务架构中,服务调用可以跨越多个微服务实例,因此需要一种机制来管理和处理服务之间的通信。

  1. 使用Feign与Nacos实现服务调用和负载均衡
  • Feign是一个声明式的Web服务客户端,它可以与多种服务注册中心集成,包括Nacos。通过使用Feign,我们可以通过简单的接口定义来调用其他微服务,并且不需要手动编写具体的HTTP请求代码。
  • Nacos作为服务注册中心,提供了服务发现和负载均衡的功能。它可以自动维护微服务实例列表,并根据负载均衡策略选择合适的实例进行调用。

下面是使用Feign与Nacos结合实现服务调用和负载均衡的步骤:

  • 步骤 1: 引入依赖

在项目的pom.xml文件中添加Feign相关的依赖:

<dependencies>
    <!-- Feign -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>
      
    <!-- 其他依赖... -->
</dependencies>
  • 步骤 2: 启用Feign客户端

在启动类上添加@EnableFeignClients注解,启用Feign客户端:

import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class StudentsServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(StudentsServiceApplication.class, args);
    }
}
  • 步骤 3: 创建Feign客户端接口

创建一个Feign客户端接口,使用@FeignClient注解指定要调用的微服务名称和相关配置:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(name = "students-service")
public interface StudentFeignClient {
    @GetMapping("/students/{id}")
    Student getStudentById(@PathVariable("id") Long id);
}
  • 步骤 4: 使用Feign客户端进行服务调用

通过注入Feign客户端接口,并调用相应的方法来进行服务调用:

import com.crazymaker.students.entity.Student;
import com.crazymaker.students.feign.StudentFeignClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class StudentService {
    private StudentFeignClient feignClient;

    @Autowired
    public StudentService(StudentFeignClient feignClient) {
        this.feignClient = feignClient;
    }

    public Student getStudentById(Long id) {
        return feignClient.getStudentById(id);
    }
}

在上面的示例中,通过serviceClient.getStudentById()来调用目标微服务的接口。

通过以上步骤,我们可以使用Feign与Nacos结合来实现服务调用和负载均衡。Feign将负责处理底层的HTTP通信细节,而Nacos将负责维护微服务实例列表和选择合适的实例进行调用,从而实现了服务调用和负载均衡的功能。

7、实现服务监控和日志管理

服务监控是指对微服务架构中的各个服务进行实时监控和管理,以确保系统的稳定性和可靠性。通过监控服务的运行状态、性能指标和异常情况,可以及时发现问题并采取相应措施,以提高系统的可用性和响应能力。

日志管理是指对微服务架构中生成的日志进行收集、存储、分析和展示的过程。日志是系统运行的重要记录,通过对日志进行管理和分析,可以了解系统的运行状况、故障信息和异常情况,以便于问题排查和系统优化。

服务监控和日志管理对于微服务架构具有重要的必要性和优势:

  • 实时监控和管理:通过服务监控,可以实时监测服务的运行状态、性能指标和异常情况,及时发现问题并采取措施,保证系统的稳定性和可靠性。
  • 故障排查和问题定位:通过日志管理,可以收集和分析系统生成的日志信息,帮助快速定位问题、排查故障,提高故障处理的效率。
  • 性能优化和系统优化:通过监控和分析服务的性能指标,可以发现性能瓶颈和优化空间,以提升系统的性能和响应能力。
  • 数据分析和业务洞察:通过对日志进行分析和挖掘,可以获得有价值的业务洞察,帮助优化业务流程和决策制定。

下面我们通过分别搭建和配置Spring Boot Admin 和 ELK 服务来实现性能监控和日志管理:

1.Spring Boot Admin 服务监控

Spring Boot Admin是一个开源的服务监控和管理工具,它提供了一个Web界面,用于监控和管理基于Spring Boot的应用程序。通过Spring Boot Admin,可以实时监控和管理应用程序的运行状态、健康状况、性能指标等,并提供了强大的可视化和告警功能。

安装和配置Spring Boot Admin的步骤如下:

  1. 按上文步骤新建一个Spring Boot项目, 添加Spring Boot Admin的依赖

    • 在Spring Boot应用程序的pom.xml文件中添加Spring Boot Admin的依赖:
<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-server</artifactId>
    <version>3.0.3</version>
</dependency>
  1. 配置bootstrap.ymlapplication.yml文件
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 10.23.48.43:8848
server:
  port: 8181
  servlet:
    context-path: /
spring:
  application:
    name: admin-service
  1. 启动Spring Boot Admin Server
@EnableDiscoveryClient
@SpringBootApplication
@EnableAdminServer
public class AdminServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(AdminServiceApplication.class, args);
    }
}

启动应用程序, 点击 http://10.23.48.43:8181/applications 访问监控页面

  1. 微服务项目配置Spring Boot Admin

1)pom.xml 里添加admin依赖

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-server</artifactId>
    <version>3.0.3</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2)在Spring Boot应用程序的配置文件(如application.yml)中,配置Spring Boot Admin Server的相关信息:

spring:
  boot:
    admin:
      client:
        url: http://10.23.48.43:8181 # Spring Boot Admin Server的地址
   
management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: ALWAYS        
  1. 重新启动应用程序

重新启动应用程序, 它将自动注册到Spring Boot Admin Server。

通过以上配置,我们可以实现Spring Boot Admin与Nacos的结合,使得应用程序能够通过Spring Boot Admin进行监控和管理。

2.ELK 日志监控

ELK是一个流行的日志管理和分析解决方案,由Elasticsearch、Logstash和Kibana三个项目组成,常用于日志收集和分析。

日志主要包括系统日志、应用程序日志和安全日志。运维和开发人员可以通过日志了解服务器运行过程中发生的错误及错误产生的原因。定期分析日志可以了解服务器的运行情况、性能、安全性等。

每台服务器或应用程序都会产生日志,如果每次都登录这些服务器查看日志并分析会耗费大量时间,而且效率低下,这时我们就需要思考如何将日志汇总起来统一查看。日志集中管理之后又会产生新的问题,日志量太大,日志统计和检索又成为新的问题,如何能实现高性能的检索统计呢?ELK能完美解决我们的问题。

  • Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
  • Logstash是一个完全开源的工具,他可以对你的日志进行收集、分析,并将其存储供以后使用。
  • kibana 也是一个开源和免费的工具,它可以为 Logstash 和 Elasticsearch 提供的日志分析友好的 Web 界面,可以汇总、分析和搜索重要数据日志。

关于ELK的原理和实操,强烈推荐:

ELK日志平台(elasticsearch +logstash+kibana)原理和实操(史上最全):

https://www.cnblogs.com/crazymakercircle/p/16732034.html

ELK安装

本文这里为了方便演示,仅演示利用docker容器在本机部署ELK,在实际生产环境下,推荐使用多台linux服务器,安装ELK集群。

首先新建elk目录,在目录下新建相关文件夹:

docker-compose.yml内容如下:

version: '3.2'

services:
    elasticsearch:
        image: elasticsearch:7.17.4
        volumes:
            - ./es/plugins:/usr/share/elasticsearch/plugins #插件文件挂载
            - ./es/data:/usr/share/elasticsearch/data #数据文件挂载
            - ./es/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml #配置
        ports:
            - '9200:9200'
            - '9300:9300'
        container_name: elasticsearch
        environment:
            - 'cluster.name=elasticsearch' #设置集群名称为elasticsearch
            - 'discovery.type=single-node' #以单一节点模式启动
            - 'ES_JAVA_OPTS=-Xms1024m -Xmx1024m' #设置使用jvm内存大小
        networks:
            - elk
    logstash:
        image: logstash:7.17.4
        container_name: logstash
        volumes:
            - './logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf'
        ports:
            - '5044:5044'
            - '50000:50000/tcp'
            - '50000:5000/udp'
            - '9600:9600'
        environment:
            LS_JAVA_OPTS: -Xms1024m -Xmx1024m
            TZ: Asia/Shanghai
            MONITORING_ENABLED: false
        links:
            - elasticsearch:es #可以用es这个域名访问elasticsearch服务
        networks:
            - elk
        depends_on:
            - elasticsearch
    kibana:
        image: kibana:7.17.4
        container_name: kibana
        volumes:
            - ./kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
        ports:
            - '5601:5601'
        links:
            - elasticsearch:es #可以用es这个域名访问elasticsearch服务
        environment:
            - ELASTICSEARCH_URL=http://elasticsearch:9200 #设置访问elasticsearch的地址
            - 'elasticsearch.hosts=http://es:9200' #设置访问elasticsearch的地址
            - I18N_LOCALE=zh-CN
        networks:
            - elk
        depends_on:
            - elasticsearch
networks:
    elk:
        name: elk
        driver:
            bridge           

在es目录下新建 data、plugins 文件夹, 以及elasticsearch.yml文件,内容如下:

cluster.name: elasticsearch # 集群名称
node.name: node-1 # 节点名称
network.host: 0.0.0.0 # 监听地址
http.port: 9200 # 监听端口
http.cors.enabled: true
http.cors.allow-origin: "*"

在logstash目录下新建logstash.conf文件, 内容如下:

input {
  tcp {
    port => 5000
    codec => json
  }
}

filter {
  # 进行过滤和转换规则的配置
}

output {
  elasticsearch {
    hosts => ["es:9200"] # Elasticsearch的地址
    index => "my-application-%{+YYYY.MM.dd}" # 索引名称,可按日期划分
  }
}

在kibana目录下,创建config文件夹,并新建kibana.yml文件,内容如下:

# Default Kibana configuration for docker target
server.host: '0.0.0.0'
server.shutdownTimeout: '5s'
elasticsearch.hosts: ['http://elasticsearch:9200']
monitoring.ui.container.elasticsearch.enabled: true
server.port: 5601 # 监听端口

启动:

docker-compose -f docker-compose.yml up -d

微服务应用接入

  • 在应用系统中,将日志输出到Logstash的监听端口。以下是一个Logback配置的示例logback-spring.xml
<configuration>
    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>10.23.48.43:5000</destination>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder" />
    </appender>

    <root level="info">
        <appender-ref ref="logstash" />
    </root>
</configuration>
  • 引入logstash依赖
<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>7.2</version>
</dependency>
  • 使用Kibana访问Elasticsearch,配置索引模式、定义可视化仪表板和图表等,以展示和分析日志数据。

通过以上步骤,我们可以搭建起ELK Stack,并将应用系统接入到ELK Stack中进行日志的收集、存储、分析和可视化展示。这样,我们可以方便地对日志进行搜索、过滤、聚合和可视化,帮助我们快速定位问题、监控系统的运行状况,并提供数据支持进行性能优化和故障排查。

通过结合这些开源中间件,我们可以实现对微服务的全面监控和日志管理,帮助我们及时发现问题、优化性能,并提供可视化的展示和分析工具,从而提升微服务架构的可靠性和稳定性。

8、保护服务安全

在微服务架构中,服务安全保护是至关重要的,它们可以保护微服务免受未经授权的访问,并确保只有经过身份验证和授权的用户才能访问受保护的资源。

Spring Cloud Gateway是一个基于Spring Framework 5、Project Reactor和Spring Boot 2构建的轻量级网关服务,用于构建和管理微服务架构中的API网关。

API网关在微服务架构中安全方面扮演着重要的角色,它作为系统的入口,它可以提供以下安全功能:

  1. 访问控制:API网关可以对传入的请求进行访问控制,确保只有经过身份验证和授权的用户能够访问受保护的资源。它可以验证请求中的身份验证令牌或证书,并根据配置的权限规则进行访问控制。

  2. 安全认证和授权:API网关可以与认证和授权中间件(如OAuth2)集成,实现对微服务的安全认证和授权。它可以验证请求中的访问令牌,并将认证和授权信息传递给后端的微服务,以确保只有具有足够权限的用户能够访问特定的资源。

  3. 保护后端服务:API网关可以隐藏后端的微服务架构,只暴露必要的接口给外部客户端,从而降低了被恶意攻击的风险。它可以阻止未经授权的请求直接访问后端服务,并提供请求的限流和缓冲功能,以保护后端服务免受过载或恶意攻击。

  4. 安全审计和日志记录:API网关可以记录请求和响应的详细信息,包括访问时间、来源IP、请求内容等,以便进行安全审计和故障排查。它可以将日志记录到集中的日志管理系统中,方便监控和分析。

  5. 攻击防护:API网关可以实施一些安全防护措施,如防止跨站脚本攻击(XSS)、跨站请求伪造(CSRF)和注入攻击等。它可以对传入的请求进行验证和过滤,以识别和阻止潜在的恶意行为。

综上所述,API网关在安全方面具有重要的作用。它可以提供访问控制、安全认证和授权、保护后端服务、安全审计和日志记录以及攻击防护等功能,帮助确保微服务架构的安全性和可靠性。

通过合理配置和使用适当的安全机制,API网关可以成为微服务架构中的首道防线,保护系统免受潜在的安全威胁。

下面是搭建和配置Spring Cloud Gateway的步骤示例:

首先创建一个Spring Boot应用, 在项目的pom.xml文件中添加相应的依赖配置。

<dependencies>
    <!-- Spring Cloud Gateway -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>

    <!-- Spring Cloud Nacos Discovery -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>

接下来,在application.yml文件中配置Spring Cloud Gateway和Nacos的相关信息。

# Spring Cloud Gateway配置
server:
  port: 8182

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          lower-case-service-id: true

# Nacos配置
spring:
  cloud:
    nacos:
      discovery:
        server-addr: ${nacos.server-addr} # Nacos Server地址

# 网关路由配置
spring:
  cloud:
    gateway:
      routes:
        - id: sample-service # 路由ID
          uri: lb://student-service # 后端服务名
          predicates:
            - Path=/student/** # 匹配的路径
          filters:
            - StripPrefix=1 # 去除前缀

以上配置中,需要将nacos.server-addr替换为实际的Nacos Server地址。

然后,创建一个启动类并添加@EnableDiscoveryClient注解,启用服务发现功能。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

最后,通过配置路由规则,将请求转发到后端的微服务。可以使用@Bean注解在配置类中定义路由规则,或者使用配置文件中的spring.cloud.gateway.routes属性进行配置。

import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GatewayConfig {

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("student-service", r -> r.path("/student/**")
                        .uri("lb://student-service"))
                .build();
    }
}

通过以上配置,Spring Cloud Gateway将根据路由规则将/sample/**路径的请求转发到名为sample-service的后端微服务。

请注意,示例中的sample-service是一个示意的后端微服务名称,需要根据实际情况替换为真实的微服务名称。

这样,结合Spring Cloud Gateway和Nacos的示例就完成了。启动应用后,它将根据配置的路由规则将请求转发到相应的后端微服务,并通过Nacos进行服务的注册和发现。

Spring Cloud Gateway作为微服务架构的入口,除了提供了路由转发,还提供了负载均衡、过滤器、安全认证、请求限流和监控等功能,

关于服务保护,本圣经后面有专栏介绍。当然,有兴趣的小伙伴可以阅读

SpringCloud gateway (史上最全) - 疯狂创客圈:https://www.cnblogs.com/crazymakercircle/p/11704077.html

进一步学习和掌握相关知识。

9、实现持续集成和部署

持续集成(Continuous Integration)是一种软件开发实践,旨在频繁地将代码集成到主干版本控制系统中。持续部署(Continuous Deployment)是持续集成的延伸,自动将通过持续集成构建的可部署软件包发布到生产环境。

以下是一种基本的实现方式:

  1. 版本控制:使用版本控制系统(如Git)管理代码,确保团队成员可以协同开发,并且每个更改都有明确的记录。
  2. 自动化构建:使用构建工具(如Maven)配置构建脚本,定义项目的编译、打包、测试等步骤。
  3. 持续集成服务器:使用持续集成服务器(如Jenkins)来触发构建,并执行自动化构建过程。
  4. 自动化测试:编写并执行自动化测试脚本,包括单元测试、集成测试和端到端测试等,以确保代码质量和功能稳定性。
  5. 自动化部署:使用容器化技术(如Docker)打包应用程序,并将其部署到预先定义的环境中,如开发环境、测试环境和生产环境。

接下来,我们将分别介绍Jenkins和Docker,然后提供详细的配置步骤来实现持续集成和部署。

1.Jenkins

Jenkins是一个开源的持续集成工具,它提供了一系列功能和插件,用于自动化构建、测试和部署软件。以下是Jenkins的基本概念和特点:

  • 作业(Job):Jenkins中的最小单位,代表一个构建或部署任务。
  • 构建(Build):Jenkins执行的一次构建过程,包括编译代码、运行测试、生成构建报告等。
  • 插件(Plugin):Jenkins提供了丰富的插件生态系统,用于扩展其功能,例如集成不同的版本控制系统、构建工具和部署平台等。

2.Docker

Docker是一个开源的容器化平台,它可以将应用程序及其依赖项打包到容器中,提供了一致、可重复和可移植的部署环境。以下是Docker的基本概念和特点:

  • 镜像(Image):Docker容器的基础组件,包含了一个完整的操作系统和应用程序的运行环境。
  • 容器(Container):基于镜像创建的运行实例,每个容器都是相互

隔离的,拥有自己的文件系统、进程空间和网络接口。

  • 仓库(Repository):用于存储和分享镜像的中央注册表,Docker Hub是最常用的公共仓库

3.配置步骤

  1. 微服务应用新增Dockerfile文件
FROM openjdk:8-jre
RUN mkdir /app
COPY students-service-exec.jar /app/app.jar
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/app.jar"]
EXPOSE 8180
  1. 安装和配置Jenkins:
  • 下载Jenkins:访问Jenkins官方网站(Jenkins download and deployment)下载适合您操作系统的Jenkins安装包。
  • 安装Jenkins:按照官方文档提供的步骤,安装Jenkins并完成初始化配置。
  • 安装插件:通过Jenkins的插件管理界面,安装必要的插件,如Git插件、Maven插件、docker插件等。

安装过程可参考 https://zhuanlan.zhihu.com/p/566398364

  1. 配置Jenkins构建任务:
  • 创建新任务:在Jenkins主界面,选择"新建任务",输入任务名称,并选择自由风格的软件项目。

  • 配置源代码管理:在任务配置界面,选择Git作为源代码管理工具,提供代码仓库的URL和凭据。

  • 配置构建步骤:在构建步骤中,可以定义构建脚本,如编译代码、运行测试、打包构建等。

  1. 安装和配置Docker:
  • 安装Docker:根据您的操作系统,参考Docker官方文档(https://docs.docker.com/get-docker/)进行Docker的安装。
  • 配置Docker构建环境:在Jenkins任务配置界面,选择"添加构建步骤",选择"Execute shell"或"Execute Windows batch command",然后在脚本中使用Docker命令构建和发布镜像。

构建成功后,我们可以在docker桌面端看到students-service服务已启动,

通过以上步骤,您可以使用Jenkins和Docker实现持续集成和部署。

Jenkins将根据配置的触发器自动执行构建任务,通过Docker构建和发布镜像,实现持续集成和部署的流程。

您可以根据具体的项目需求和环境配置Jenkins任务和Docker构建脚本,以实现自动化的软件交付流程。

10、小结

在本文中,我们首先讨论了微服务框架的基本原则,然后通过安装和配置Java、Maven、Git和IDEA等工具,为搭建基础设施做好准备。接着,我们定义了微服务接口和协议,并使用JPA提供了增删改查的代码示例。通过集成Nacos,我们实现了服务注册与发现,以及使用Feign实现服务调用和负载均衡。

我们还介绍了Spring Boot Admin和Elasticsearch,用于实现服务监控和日志管理。最后,我们使用Spring Cloud Gateway实现了服务安全保护,并通过Jenkins和Docker实现了持续集成和部署。

通过这个搭建过程,我们达到了构建一个完整的Java微服务框架的目标。

我们建立了基础设施,定义了接口和协议,实现了服务注册与发现、服务调用和负载均衡、服务监控和日志管理、服务安全和认证授权,并实现了持续集成和部署。

搭建过程存在的不足和改进的方向如下:

  1. 性能监控和报警:在服务监控和日志管理部分,我们可以进一步改进,引入Prometheus和Grafana来实现更全面的性能监控和报警功能。Prometheus是一个开源的监控系统,可以收集和存储各种指标数据,并提供强大的查询和报警功能。Grafana是一个数据可视化工具,可以将Prometheus收集的数据以图表的形式展示出来,帮助我们更直观地了解系统的性能状况。通过使用Prometheus和Grafana,我们可以实时监控系统的指标,并设置报警规则,及时发现并解决潜在的性能问题。
  2. 为了保障微服务系统的稳定性和可靠性,你还需要考虑服务的熔断、限流、降级等策略。可以使用 Hystrix 或者 Resilience4j 等库来实现这些功能。
  3. 容器化部署:在持续集成和部署部分,我们可以进一步改进,引入Kubernetes(K8s)来实现容器化部署。Kubernetes是一个开源的容器编排平台,可以简化和自动化应用程序的部署、扩展和管理。通过使用Kubernetes,我们可以将微服务框架中的各个服务容器化,并通过K8s进行部署、伸缩和管理,提供更高效、可靠和弹性的部署方案。
  4. 自动化和流程改进:在持续集成和部署部分,我们可以进一步改进和优化自动化流程。通过使用更先进的CI/CD工具和技术,如Jenkins Pipeline、GitOps等,可以实现更高度的自动化和流程改进。例如,可以通过编写自动化的流水线脚本,实现代码的构建、测试、打包和部署的自动化,并与版本控制系统(如Git)进行集成,实现代码的自动触发和持续交付。

通过上述改进,我们可以进一步提升微服务框架的性能监控、报警能力,以及部署和管理的效率和可靠性。这将有助于更好地满足不断变化的业务需求,并提升系统的可靠性和稳定性。

技术自由的实现路径 PDF:

实现你的 架构自由:

《吃透8图1模板,人人可以做架构》

《10Wqps评论中台,如何架构?B站是这么做的!!!》

《阿里二面:千万级、亿级数据,如何性能优化? 教科书级 答案来了》

《峰值21WQps、亿级DAU,小游戏《羊了个羊》是怎么架构的?》

《100亿级订单怎么调度,来一个大厂的极品方案》

《2个大厂 100亿级 超大流量 红包 架构方案》

… 更多架构文章,正在添加中

实现你的 响应式 自由:

《响应式圣经:10W字,实现Spring响应式编程自由》

这是老版本 《Flux、Mono、Reactor 实战(史上最全)》

实现你的 spring cloud 自由:

《Spring cloud Alibaba 学习圣经》

《分库分表 Sharding-JDBC 底层原理、核心实战(史上最全)》

《一文搞定:SpringBoot、SLF4j、Log4j、Logback、Netty之间混乱关系(史上最全)》

实现你的 linux 自由:

《Linux命令大全:2W多字,一次实现Linux自由》

实现你的 网络 自由:

《TCP协议详解 (史上最全)》

《网络三张表:ARP表, MAC表, 路由表,实现你的网络自由!!》

实现你的 分布式锁 自由:

《Redis分布式锁(图解 - 秒懂 - 史上最全)》

《Zookeeper 分布式锁 - 图解 - 秒懂》

实现你的 王者组件 自由:

《队列之王: Disruptor 原理、架构、源码 一文穿透》

《缓存之王:Caffeine 源码、架构、原理(史上最全,10W字 超级长文)》

《缓存之王:Caffeine 的使用(史上最全)》

《Java Agent 探针、字节码增强 ByteBuddy(史上最全)》

实现你的 面试题 自由:

4000页《尼恩Java面试宝典 》 40个专题

以上尼恩 架构笔记、面试题 的PDF文件更新,▼请到下面【技术自由圈】公号取 ▼

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/541491.html

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

相关文章

全网独家首发最牛最全面的JMeter使用BeanShell断言

BeanShell简介 BeanShell是使用Java语法的一套脚本语言&#xff0c;在JMeter的多种组件中都有BeanShell的身影&#xff0c;如&#xff1a; 定时器&#xff1a;BeanShell Timer前置处理器&#xff1a;BeanShell PreProcessor采样器&#xff1a;BeanShell Sampler后置处理器&am…

JAVA - 字符串工具类StringBuilder和StringBuffer

文章目录 目录 文章目录 前言 二.常用方法演示 1.append()用于将指定的字符串添加到当前StringBuilder对象的末尾 2.delete()&#xff1a;用于删除StringBuilder对象中指定位置的字符。 3.insert()&#xff1a;用于在指定位置插入指定字符串。 4.replace()&#xff1a;用于替换…

YOLOv5【detect.py源码及参数】超详细注释解读!!!建议收藏✨✨!

之前的文章介绍了YOLOv5的网络结构&#x1f680;与目录结构源码&#x1f680;的详细解读&#xff0c;今天带来的是YOLOv5的 detect.py 代码逐行解读以及注释&#xff0c;废话不多说&#xff0c;让我们一起学习YOLOv5的 detect.py 源码吧&#xff01; YOLOv5所使用版本&#xf…

RocketMQ介绍

一、MQ简介 1.1 项目工程弊端 1.2 MQ简介 MQ&#xff08;Message Queue&#xff09;消息队列&#xff0c;是一种用来保存消息数据的队列 队列&#xff1a;数据结构的一种&#xff0c;特征为 “先进先出” 何为消息: 服务器间的业务请求 原始架构&#xff1a; 服务器中的A功能…

Java并发编程:并发问题和多线程技术的应用和优化

章节一&#xff1a;引言 在当今的软件开发领域中&#xff0c;多线程编程是一项至关重要的技术。随着处理器核心数量的增加和计算机系统的并行性的不断提高&#xff0c;充分利用多核心处理器的能力已成为现代软件开发的关键要素之一。Java作为一种强大的编程语言&#xff0c;在…

MobPush Flutter平台插件

集成准备 注册账号 使用PushSDK之前&#xff0c;需要先在MobTech官网注册开发者账号&#xff0c;并获取MobTech提供的AppKey和AppSecret&#xff0c;详情可以点击查看注册流程 MobPush后台配置 注册MobTech账号后&#xff0c;需要在MobTech后台进行相关信息的配置&#xff…

信息学算法竞赛中一种特殊的数据读入方式

在算法竞赛中&#xff0c;有时会出现一些特殊的数据读入&#xff0c;比如每行的数据元素个数不确定&#xff0c;更复杂一些的是连续多行的数据个数不确定。单行的不确定元素个数的读入可以借助 w h i l e ( while( while(~ s c a n f ( ) ) scanf()) scanf())或 w h i l e ( c …

简单实现小程序授权登录功能

本人给大家带来了关于微信小程序的相关知识&#xff0c;其中主要介绍了怎么实现小程序授权登录功能的相关内容&#xff0c;下面一起来看一下&#xff0c;希望对大家有帮助。 在我们平时工作、学习、生活中&#xff0c;微信小程序已成为我们密不可分的一部分&#xff0c;我们仔细…

【Java】记录一次服务性能问题定位、调优完整过程

文章目录 背景压测准备初步压测结论 排查过程记录排除中间件及网络因素借助Arthas及Skywalking暴露prometheus指标修改数据库最大连接池数场景一场景二场景三场景四场景五场景六场景七场景八结论 Consumer消费能力优化增加消费者增加Topic Queue数量Queue总数&#xff1a;96Que…

Redis:哨兵模式——可以理解为主从复制的升级版

如果不懂什么是主从复制&#xff0c;可以看我的上一篇文章&#xff0c;这一篇文章与上一篇文章息息相关&#xff0c;可以先去大概去了解一下。 Redis:主从复制_通过此功能实现对内存上的数据更好的保护_不想睡醒的梦的博客-CSDN博客 什么是哨兵模式&#xff1f; 上一篇文章主…

【穿针引线】基于ElAdmin项目论Spring Security的工作原理,实现前后端OAuth2单点登录,源码分析

【穿针引线】基于ElAdmin项目论Spring Security的工作原理&#xff0c;源码分析 序一、核心类1.1 SecurityContext 安全上下文1.2 网安适配器WebSecurityConfigurerAdapter1.3 认证器 Authentication1.4 信息认证提供者1.4.1 抽象用户信息认证提供者 AbstractUserDetailsAuthen…

01-C++-VSCode配置C++环境(windows)

VSCode配置C环境 前言安装VSCode安装mingw编译器VSCode配置C环境 前言 本篇来学习写使用VSCode配置C环境 安装VSCode 下载地址&#xff1a;VSCode 下载后路next安装即可 安装mingw编译器 下载地址&#xff1a;mingw64 点击Files 向下拉&#xff0c;点击下载(建议windows6…

Python系列之字符串和列表

感谢点赞和关注 &#xff0c;每天进步一点点&#xff01;加油&#xff01; 目录 一、字符串 1.1 字符串的定义与输入 1.2 字符串的拼接与格式化输出 1.3 字符串的下标 1.4 字符串的切片和倒序 1.5 字符串的常见操作 二、列表-List 2.1 列表的常见操作 2.2 列表合并和拼…

【云原生-深入理解Kubernetes-2】容器 Linux Cgroups 限制

文章目录 系列文章目录&#x1f479;关于作者回顾一、Docker Engine 和 Hypervisor 区别二、容器比虚拟机受欢迎&#xff1f;优势劣势 三、Linux Cgroups 限制使用 Cgroups 子系统配置文件- 前提知识- 限制 ✊ 最后 系列文章目录 【云原生-深入理解Kubernetes-1】容器的本质是进…

一文理解RocketMQ

概述 RocketMQ是阿里开发的基于JMS的分布式消息中间件&#xff0c;是由纯JAVA实现的。放弃了比较重量级的Zookeeper作为注册中心&#xff0c;使用自研的NameServer实现元数据的管理&#xff0c;支持事务消息&#xff0c;顺序消息&#xff0c;批量消息&#xff0c;定时消息以及消…

软件体系结构复习题

2020 论述题 统一软件过程RUP&#xff1a;用例驱动、以架构为中心的迭代增量开发 一个用例可能需要多个功能来实现&#xff0c;一个功能也可能被用于多个用例 边界类、控制类、实体类 顺序图、通信图、定时图、交互概述图 扩展关系《extend》、包含关系《include》、…

python将图片批量排版插入Word文档

今天分享一个将图片批量插入word文档的小脚本&#xff0c;本脚本可以实现 jpg\png图片&#xff0c;可以混合在一起&#xff01; 首先 我们需要设置每页word文档的排版需求&#xff0c;如&#xff1a;每页6张图片&#xff0c;一共是3行2列 pics_per_page 6&#xff0c;这是每页…

解说天下之操作系统

解说天下之操作系统 本文由桌案drawon (https://www.drawon.cn)&#xff0c;云晶&#xff08;https://www.yunjingxz.com&#xff09;创始人根据多年从业经验&#xff0c; 从操作系统的起源&#xff0c;应用分类&#xff0c; 设计分类&#xff0c;以及资源使用角度对操作系统进…

leetcode 数据库题 175~185

leetcode 数据库题 175. 组合两个表176. 第二高的薪水177. 第N高的薪水178. 分数排名180. 连续出现的数字181. 超过经理收入的员工182. 查找重复的电子邮箱183. 从不订购的客户184. 部门工资最高的员工185. 部门工资前三高的所有员工小结 嗯。。。数据库题目就不贴原题内容了&…

00后是真卷不过,工作没两年,跳槽到我们公司起薪20K都快接近我了

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&…