微服务简介,SpringCloud Alibaba Nacos的安装部署与使用,Nacos集成springboot

news2024/11/25 16:35:17

目录

一.认识微服务

1.0.学习目标

1.1.单体架构

单体架构的优缺点如下:

1.2.分布式架构

分布式架构的优缺点:

1.3.微服务

微服务的架构特征:

1.4.SpringCloud

1.5Nacos注册中心

1.6.总结

二、Nacos基本使用

(一)linux安装包方式单节点安装部署

1. jdk安装配置

2. nacos安装

(二)linux源码方式单节点安装部署

1、下载Nacos源码并解压缩,另一种方法

2、配置Nacos

3、创建数据库和数据表

4、启动Nacos

(三)Nacos集成SpringBoot实现服务注册与发现

1、创建父工程

2、创建基础公共模块

3、创建用户模块

4、将用户模块作为微服务注册到nacos

(四)解决登录问题

三、基于Feign实现服务之间的远程调用

(一)什么是Feign

(二)Feign的使用

1、加入Fegin的依赖

2、在user模块启动类上添加Fegin的注解

3、创建order-module模块

4、创建一个feign接口, 并使用Fegin实现微服务调用order模块的数据

5、controller调用feign,并启动user模块服务验证

(三)Feign负载均衡

1、首先要把order模块设置为可以开启多个服务

2、注意:多次启动的端口号不能一致

3、测试


注意:只要开启虚拟机,一定要关闭防火墙

一.认识微服务

随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢?

1.0.学习目标

了解微服务架构的优缺点

1.1.单体架构

单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。

单体架构的优缺点如下:

优点:

  • 架构简单

  • 部署成本低

缺点:

  • 耦合度高(维护困难、升级困难)

1.2.分布式架构

分布式架构:根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发,称为一个服务。

分布式架构的优缺点:

优点:

  • 降低服务耦合

  • 有利于服务升级和拓展

缺点:

  • 服务调用关系错综复杂

分布式架构虽然降低了服务耦合,但是服务拆分时也有很多问题需要思考:

  • 服务拆分的粒度如何界定?

  • 服务之间如何调用?

  • 服务的调用关系如何管理?

人们需要制定一套行之有效的标准来约束分布式架构。

1.3.微服务

微服务:一种良好架构设计的分布式架构方案

根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发,称为一个服务。

项目中每一个模块(module)就叫做一个服务

SpringCloud是目前国内使用最广泛的微服务框架

SpringCloud-Alibaba 也推出了一个名为Nacos的注册中心组件

微服务的架构特征:

  • 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责,每个服务只做一件事

  • 自治:团队独立、技术独立、数据库独立,独立部署和交付

  • 面向服务:服务提供统一标准的接口,与语言和技术无关

  • 隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题

微服务的上述特性其实是在给分布式架构制定一个标准,进一步降低服务之间的耦合度,提供服务的独立性和灵活性。做到高内聚,低耦合。

因此,可以认为微服务是一种经过良好架构设计的分布式架构方案

但方案该怎么落地?选用什么样的技术栈?全球的互联网公司都在积极尝试自己的微服务落地方案。

其中在Java领域最引人注目的就是SpringCloud提供的方案了。

1.4.SpringCloud

SpringCloud是目前国内使用最广泛的微服务框架。官网地址:Spring Cloud。

SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验。

其中常见的组件包括:

另外,SpringCloud底层是依赖于SpringBoot的,并且有版本的兼容关系,如下:官网版本说明

1.5Nacos注册中心

Nacos:服务注册中心,项目每一个module模块启动服务都会注册到Nacos网站里面

国内公司一般都推崇阿里巴巴的技术,比如注册中心,SpringCloudAlibaba也推出了一个名为Nacos的注册中心。

Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它是 SpringCloud Alibaba 组件之一,负责服务注册发现和服务配置,可以这样认为nacos=eureka+config。

1.6.总结

  • 单体架构:简单方便,高度耦合,扩展性差,适合小型项目。例如:学生管理系统

  • 分布式架构:松耦合,扩展性好,但架构复杂,难度大。适合大型互联网项目,例如:京东、淘宝

  • 微服务:一种良好的分布式架构方案

    ①优点:拆分粒度更小、服务更独立、耦合度更低

    ②缺点:架构非常复杂,运维、监控、部署难度提高

  • SpringCloud是微服务架构的一站式解决方案,集成了各种优秀微服务功能组件

  • Nacos:服务注册中心,SpringCloudAlibaba推出的微服务功能组件。

二、Nacos基本使用

(一)linux安装包方式单节点安装部署

官方快速开始教程连接地址
Nacos支持三种部署模式,分别是单机,集群和多集群。需要注意的是,Nacos依赖Java环境,并且要求使用JDK1.8以上版本。
Nacos的安装方式有两种,一种是源码安装,另一种直接是使用已经编译好的安装包。这里选择使用安装包方式安装。

1. jdk安装配置

在 Linux 中安装和配置 JDK 需要以下步骤:
检查系统中是否已经安装过 JDK 和 JRE。可以使用以下命令来检查:

java -version

如果系统中没有安装 JDK 和 JRE,则需要下载并安装 JDK。
下载教程:Linux安装配置jdk11_jdk-11.0.12_linux-x64_bin.tar.gz_半截的诗--的博客-CSDN博客

验证 JDK 是否安装配置成功。可以使用以下命令:

java -version

执行该命令后,应该能看到已经安装的 JDK 版本信息。

2. nacos安装

  1. 下载nacos的GitHub地址

​​​​在这里插入图片描述

2、解压Nacos安装包 

tar -zxvf nacos-server-2.2.2.tar.gz  -C /opt/enviroment/

解压完成后,会在解压的目录中看到一个nacos的文件夹。

3、关闭防火墙

查看防火状态

systemctl status firewalld 

关闭防火墙:

systemctl stop firewalld

4、启动Nacos服务
 进入nacos,执行以下命令:

[root@bogon nacos]# sh bin/startup.sh -m standalone
/java/jdk-11.0.16//bin/java   -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -Dnacos.member.list= -Xlog:gc*:file=/nacos/nacos/logs/nacos_gc.log:time,tags:filecount=10,filesize=102400 -Dloader.path=/nacos/nacos/plugins/health,/nacos/nacos/plugins/cmdb,/nacos/nacos/plugins/selector -Dnacos.home=/nacos/nacos -jar /nacos/nacos/target/nacos-server.jar  --spring.config.additional-location=file:/nacos/nacos/conf/ --logging.config=/nacos/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288
nacos is starting with standalone
nacos is starting,you can check the /nacos/nacos/logs/start.out

这样,就会启动Nacos服务。

5、访问Nacos服务

执行以下命名

[root@localhost nacos]# cat /opt/enviroment/nacos/logs/start.out


Nacos默认的访问地址为http://localhost:8848/nacos,如果用虚拟机部署的Nacos服务,那访问地址就是虚拟机的IP地址了:http://192.168.100.129:8848/nacos/index.html


可以在浏览器中输入该地址来访问Nacos服务。如果一切正常,将会看到Nacos的登录界面,输入默认账号(nacos)密码(nacos)即可登录。

 到此,Nacos服务在Linux环境下的安装部署就完成了。如果想要深入了解更多关于Nacos的使用和配置,可以查看Nacos官方文档(https://nacos.io/zh-cn/docs/what-is-nacos.html)。
在这里插入图片描述
在这里插入图片描述

(二)linux源码方式单节点安装部署

1、下载Nacos源码并解压缩,另一种方法

可以省略,继续下面步骤

在官网 https://github.com/alibaba/nacos/releases 下载源代码,可以选择.tar.gz或.zip格式的文件,解压到你想要安装的目录中。

wget https://github.com/alibaba/nacos/releases/download/2.2.2/nacos-server-2.2.2.tar.gz
tar -zxvf nacos.tar.gz

2、配置Nacos

第一步可以省略,可以进行按照上面的步骤进行,直接使用上面解压的nacos文件

进入解压后的nacos目录,修改conf/application.properties文件:

# 启用standalone模式
nacos.standalone=true
# 修改端口号
server.port=8848
# 修改数据存储位置
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.216.176:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456

注意要修改以下参数:
server.port:修改为要使用的端口号
db.url.0:修改为MySQL数据库的连接地址,IP地址是当前网络属性的IPv4地址,

db.user、db.password:并设置正确的数据库用户名和密码

3、创建数据库和数据表

使用MySQL客户端创建nacos数据库和数据表

找到虚拟机中/opt/enviroment/nacos/conf文件夹

去MySQL客户端运行mysql-schema.sql文件

 

创建完成如下:

 

4、启动Nacos

进入解压后的nacos文件夹,使用以下命令启动Nacos服务:

[root@bogon nacos]# sh bin/startup.sh -m standalone

如果启动成功,你应该可以在浏览器中访问

http://虚拟机ip地址:8848/nacos

http://192.168.100.129:8848/nacos/

来查看Nacos控制台。

至此,Nacos就成功安装完成了。

(三)Nacos集成SpringBoot实现服务注册与发现

1、创建父工程

创建一个maven工程,然后在pom.xml文件中添加下面内容
各个版本的对应关系参考官网:官网版本对应关系描述地址

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>spring-Cloud</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>User-module</module>
        <module>common</module>
    </modules>


    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <!--springboot依赖版本是2.6。11-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.11</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <dependencyManagement>
        <dependencies>
            <!--Cloud依赖 版本2021.0.4-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2021.0.4</version>
 <!--type和scope是代表子模块可以继承cloud这个版本,子模块要是下载关于cloud的依赖,就默认使用这个版本了-->
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!--阿里巴巴依赖 版本2021.0.4.0-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.0.4.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

2、创建基础公共模块

创建common公共模块 

在pom.xml中添加依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-Cloud</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.common.yka</groupId>
    <artifactId>common</artifactId>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>

        <!--web场景开发启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--druid依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.15</version>
        </dependency>

        <!--mybatis依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>

        <!-- 数据库驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.27</version>
        </dependency>

        <!-- mybatis-plus启动器-->
        <!-- mybatis-plus 是自己开发,并非官方的! -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

    </dependencies>

</project>

3、创建用户模块

步骤:
1 创建模块

 2、导入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-Cloud</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.user.yka</groupId>
    <artifactId>User-module</artifactId>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>

        <!--nacos客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!--引用公共common的pom.xml依赖-->
        <dependency>
            <groupId>org.common.yka</groupId>
            <artifactId>common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

    </dependencies>


</project>

引用公共pom.xml配置文件,直接就可以使用pom文件的依赖了

3、 创建SpringBoot主类

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

4、加入配置文件

spring:
  application:
    name: user-server #服务名称
  # 配置数据源
  datasource:
    druid:
      url: jdbc:mysql://localhost:3306/nacos?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
      driver-class-name: com.mysql.cj.jdbc.Driver
      username: root
      password: 123456

5、创建必要的接口和实现类(controller service dao)

@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/test")
    public String test(){
        return "aaaaaa";
    }
}

4、将用户模块作为微服务注册到nacos

接下来开始修改User-module模块的代码, 将其注册到nacos服务上

1、在User-module模块的pom.xml中添加nacos的依赖

        <!--nacos客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

2、在主类上添加@EnableDiscoveryClient注解 

@SpringBootApplication
@EnableDiscoveryClient
public class UserApplication {
  public static void main(String[] args) {
      SpringApplication.run(UserApplication.class,args);
  }
}

3、在application.yml中添加nacos服务的地址 

spring:
  application:
    name: user-server #服务名称
  # 配置数据源
  datasource:
    druid:
      url: jdbc:mysql://localhost:3306/nacos?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
      driver-class-name: com.mysql.cj.jdbc.Driver
      username: root
      password: 123456
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.100.129:8848 #虚拟机ip地址和端口号

4、启动服务, 观察nacos的控制面板中是否有注册上来的商品微服务,即为成功
在这里插入图片描述

注意:只要开启虚拟机,一定要关闭防火墙

如果启动不了报错,有可能出现的问题是:防火墙没有关闭,关闭防火墙后再去开启Nacos服务

查看防火状态

systemctl status firewalld

img

关闭防火墙:

systemctl stop firewalld

然后再去启动Nacos服务

(四)解决登录问题

到现在配置为止网页现在是跳过权限认证,不需要登录就进去了,我们来解决问题让nacos网页可以登录

修改 /nacos/conf/application.properties 配置文件

  1. 启动登录认证功能 nacos.core.auth.enabled=true 修改为true

  2. 客户端和服务端交互时用于加密的密钥,可以防止认证过程中的信息泄露。nacos.core.auth.server.identity.key=example nacos.core.auth.server.identity.value=example 赋值

  3. 设置 Token 认证的密钥:nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789

  4. Nacos集成SpringBoot实现服务注册与发现,操作服务注册是,yml文件中需要添加 username和passwrod

    cloud:
      nacos:
        discovery:
          username: nacos #nacos网址的账号密码
          password: nacos

此时 sh shutdown.sh 关闭服务, 再重启服务,进入nacos页面就可以登录了

 

三、基于Feign实现服务之间的远程调用

简单来说:项目中模块之间可以相互调用

(一)什么是Feign

Feign是Spring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地服务 一样简单, 只需要创建一个接口并添加一个注解即可。 Nacos很好的兼容了Feign, Feign默认集成了 Ribbon, 所以在Nacos下使用Fegin默认就实现了负 载均衡的效果

(二)Feign的使用

1、加入Fegin的依赖

 <dependencies>
​
        <!--nacos客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
​
​
        <!--引用公共common的pom.xml依赖-->
        <dependency>
            <groupId>org.common.yka</groupId>
            <artifactId>common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
​
        <!--负载均衡依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
​
        <!--加入Fegin的依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>

2、在user模块启动类上添加Fegin的注解

@SpringBootApplication
@EnableDiscoveryClient//@EnableDiscoveryClient是一个Spring Cloud中的注解,用于启用服务发现功能(nacos)。
@EnableFeignClients//开启Fegin
public class UserModuleApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserModuleApplication.class, args);
    }
}

3、创建order-module模块

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-Cloud</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
​
    <groupId>org.order.yka</groupId>
    <artifactId>Order-module</artifactId>
​
    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
​
​
    <dependencies>
        <!--引用公共模块common依赖-->
        <dependency>
            <groupId>org.common.yka</groupId>
            <artifactId>common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
​
        <!--nacos客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>
​
</project>
spring:
  application:
    name: order-server #服务名称
  # 配置数据源
  datasource:
    druid:
      url: jdbc:mysql://localhost:3306/nacos?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
      driver-class-name: com.mysql.cj.jdbc.Driver
      username: root
      password: 123456
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.100.129:8848 #虚拟机ip地址和端口号
        username: nacos #nacos网址的账号密码
        password: nacos
server:
  port: ${random.int[0000,9999]} #随机生成端口号
​
@RestController
@RequestMapping("/order")
public class OrderController {
​
    @GetMapping("/test")
    public Integer test(){
        return 1111;
    }
}

4、创建一个feign接口, 并使用Fegin实现微服务调用order模块的数据

@FeignClient(value = "order-server",path = "/order")//value:声明调用的提供者的服务名,path:提供者的路径
public interface OrderFeign {
    //指定调用提供者的哪个方法
//@FeignClient+@GetMapping 就是一个完整的请求路径
    @GetMapping("/test")
    Integer getOrderNum();
}

5、controller调用feign,并启动user模块服务验证

这就相当于user为客户端了,order为服务器,user服务向order服务发送请求

@RestController
@RequestMapping("/user")
public class UserController {
​
    @Autowired
    private OrderFeign orderFeign;
​
    @GetMapping("/test")
    public Integer test(){
        return orderFeign.getOrderNum();
    }
​
}

(三)Feign负载均衡

在Nacos下使用Fegin默认就实现了负载均衡的效果,以下只是展示理解理解

负载均衡(Load Balancing)是分布式系统架构中重要的机制之一。主要作用是将任务或请求分摊到多个服务器上,从而达到最大化吞吐量或最小化响应时间的目的。

1、首先要把order模块设置为可以开启多个服务

 可以在order模块的启动类上多次启动

2、注意:多次启动的端口号不能一致

接下来把order模块的端口号设置为随机的

server:
  port: ${random.int[0000,9999]} #随机生成端口号

3、测试

把order模块的controller返回值修改333之后,启动一次order模块,启动后端口号会随机生成

一开始返回值是1111,他们分别开启了两个服务,所以端口号是不一致的

@RestController
@RequestMapping("/order")
public class OrderController {
​
    @GetMapping("/test")
    public Integer test(){
        return 3333;
    }
}

访问网站,每次刷新都是不一样的数据

这就是负载均衡

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

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

相关文章

【C++】深入剖析C++11新特性

目录 一、C11简介 二、统一的列表初始化 1.&#xff5b;&#xff5d;初始化 2.std::initializer_list 三、声明 1.auto 2.decltype 3.nullptr 四、范围for 五、final和oberride 六、STL中一些变化 1.array 2.forward_list 3.unordered_map和unordered_set 七、右…

RabbitMQ养成记 (2. java操作MQ快速入门,日志监控,消息追踪)

快速入门 刚开始我们就一步一步来&#xff0c; 先搞什么spring集成。 先使用原始的java代码来操作一下MQ。 这里给新手兄弟的建议&#xff0c;这种技术性的学习 一定要先动手&#xff0c;从简单的地方动手&#xff0c;一步一步来&#xff0c;不然上来就搞理论或者复杂的应用很…

JDBC API

注册数据库驱动 Class.forName("com.mysql.jdbc.Driver"); 所谓的注册驱动&#xff0c;就是让JDBC程序加载mysql驱动程序&#xff0c;并管理驱动 驱动程序实现了JDBC API定义的接口以及和数据库服务器交互的功能&#xff0c;加载驱动是为了方便使用这些功能。 获…

Spring IOC相关注解运用——下篇

目录 一、Configuration 二、ComponentScan 1. 说明 2. 测试方法 3. 运行结果 三、PropertySource 1. 说明 2. 测试方法 3. 测试结果 四、Bean 1. 说明 2. 添加驱动依赖 3. 将Connection对象放入Spring容器 3. 测试 五、Import 1. 说明 2. 测试方法 3. 运行结…

从一道go逆向出发,讨论类tea的逆算法

tea代码很短&#xff0c;经常被直接复制为源码&#xff08;而不是像标准算法那样调库&#xff09;。在ctf逆向中也算比较常见&#xff0c;复杂度适中。 例题是一道go逆向&#xff0c;经go parser处理后&#xff0c;核心代码如下图。 panic算是go的专有名词&#xff0c;类似异常…

吃透 Spring AOP (1.理解概念)

理解 什么是AOP AOP&#xff0c;全称面向切面编程。 它可以说是对面向对象OOP的思想升华。从总的理解来讲&#xff0c;AOP是横向对不同程序的抽象。这个思想要不断实践动手之后&#xff0c;才会有很深刻的理解 理解 代理模式 在理解AOP之前&#xff0c;我们首先要单独说一个…

FFMPEG录屏(16)--- MAG(Magnification)捕获桌面

最近增加了对Magnification API捕获桌面的支持&#xff0c;记录一下过程和其中遇到的问题。 参考资料 Magnification API overview Magnification API sample webrtc screen_capturer_win_magnifier.cc Structured Exception Handling (C/C) 前言 我又不得不吐槽一下了&a…

【JavaWeb】-- HTTP、Tomcat、Servlet

文章目录 HTTP1.简介2.请求数据格式2.2.1 格式介绍 3.响应数据格式3.1 格式介绍3.2 响应状态码 Tomcat1.简介1.1 什么是Web服务器 2.基本使用2.1 安装2.2 启动2.3 关闭 3.Maven创建Web项目4.IDEA使用Tomcat4.1集成本地Tomcat4.2 Tomcat Maven插件 Servlet1.简介2.快速入门3.执行…

okhttp篇3:RealCall

Call Call一般代表一个已经准备好的Request&#xff0c;Request的包装类&#xff0c;可执行&#xff0c;它一般有两个主要的方法&#xff1a; execute(立即执行&#xff0c;并阻塞线程&#xff0c;直到Response返回)enqueue(将Request放入队列&#xff0c;等待线程池调度执行…

spring源码学习_01 本地环境搭建

参考网上各种资源&#xff0c;终于把spring源码运行起来了&#xff1b;步骤总结如下&#xff1a; spring版本&#xff1a; 5.2.x 本地系统mac idea 2019.3.2 下载地址&#xff1a;https://www.jetbrains.com/idea/download/other.html jdk 11 下载地址&#xff1a;https://repo…

【设计模式二十三剑】✨编写更高质量代码的秘诀✨

文章目录 ✨✨简述&#x1f386;【万能之门】简单工厂模式&#xff08;Simple Factory&#xff09;&#x1f387;【制造之剑】工厂方法模式&#xff08;Factory Method&#xff09;&#x1f387;【生产之剑】抽象工厂模式&#xff08;Abstract Factory&#xff09;&#x1f387…

C语言基础知识:函数的调用

函数的定义 一般来说&#xff0c;执行源程序就是执行主函数main&#xff0c;其他函数只能被主函数所调用&#xff0c;而其他函数之间也可以相互调用。 1.标准库函数&#xff1a; 分为&#xff1a;I/O函数&#xff0c;字符串&#xff0c;字符处理函数&#xff0c;数学函数&am…

Go语言的函数和defer用法

目录 函数的基本用法 函数中的变长参数 递归函数(recursion) 函数是“一等公民” 函数中defer的用法 defer的底层原理 使用 defer 跟踪函数的执行过程 defer的注意事项 &#xff08;1&#xff09;Go语言内置的函数中哪些可以作为deferred 函数 &#xff08;2&#xf…

面试code(1)—— 排序算法

算法动画 从小到大排序 1 冒泡排序 被动的将最大值送到最右边 1、比较相邻的元素。如果第一个比第二个大&#xff0c;就交换他们两个。 2、对每一对相邻元素作同样的工作&#xff0c;从开始第一对到结尾的最后一对。这步做完后&#xff0c;最后的元素会是最大的数。 3、针对…

Redis修炼 (17. redis主从集群的数据同步原理 全量同步/增量同步)

数据同步 在一个集群之中 数据同步是很重要的。 redis的集群有多种。 我们这次主要说 主从集群。 全量同步 既然是主从集群 那么肯定是 1个master节点 多个从节点。redis的集群中的第一次同步 我们叫 全量同步&#xff1a; 为什么要强调第一次&#xff1f; 因为如果你是第一…

独家策略大放送:最高年化150%的策略,谁不感兴趣?(含免费版)

上一节我们在沪深300中回测了550中均线交叉策略,有朋友想看看这些策略在沪深300以外的中小市场表现如何,同时大家都非常好奇表现抢眼的老Q自研指标WMA_Q系列到底是怎么计算的。 于是老Q又选择了中证500和创业板指来验证下这些策略是否能有同样的表现(PART 1),顺便在今天的…

流水线中的握手信号笔记

1.《握手信号的打拍(一)》 解释了&#xff0c;为什么在流水线中&#xff0c;握手信号不能简单得加一级寄存器 业界关于流水线级握手信号的标准答案是 skid buffer&#xff0c;此外还有人提到了 Register slice 2.《握手信号的打拍(二)》 为什么简单加一级寄存器会握手失败 &…

抖音SEO系统源码开发搭建/MVC二次开发定制

首先&#xff0c;抖音SEO矩阵系统源码开发&#xff0c;如何做独立部署&#xff0c;首先我们需要深刻理解这个系统的开发逻辑是什么&#xff1f;开发的前言是在抖音平台做流量新增&#xff0c;现在抖音及各大主流短视频平台&#xff0c;流量新增&#xff0c;各大企业需要在短视频…

Redis BigKey

Redis BigKey 一 面试题引入二 MoreKey案例2.1 大批量往redis里面插入2000W测试数据key2.1.1 Linux Bash下执行&#xff0c;插入100W2.1.2 通过redis提供的管道 --pipe命令插入100W大批量数据 2.2 key *2.3 生产上如何限制keys*/flushdb/flushall等危险命令以防止误删误用&…

我们在操作自动化测如何实现用例设计实例

在编写用例之间&#xff0c;笔者再次强调几点编写自动化测试用例的原则&#xff1a; 1、一个脚本是一个完整的场景&#xff0c;从用户登陆操作到用户退出系统关闭浏览器。 2、一个脚本脚本只验证一个功能点&#xff0c;不要试图用户登陆系统后把所有的功能都进行验证再退出系统…