从零搭建 Spring Cloud 服务(超级详细)

2023-11-01

点击上方 Java后端,选择 设为星标

优质文章,及时送达


作者: Anakki;链接:blog.csdn.net/qq_29519041/article/details/85238270

这里会介绍很多基础知识,直接想开始搭建微服务的可以看第二章,微服务的搭建。直接看第二章不会有什么影响,可以先学会开车再学习车的构造的,看个人习惯来。

1.什么是SpringCloud?

SpringCloud官网:https://spring.io/projects/spring-cloud(个人建议是用谷歌浏览器访问官网打开中文翻译粗略把官网读一遍)

把 Spring 全家桶相关的文章整理成了 PDF,关注微信公众号 Java后端,回复 666 下载这个技术栈手册。

个人理解:

以前的服务器就好像,一个会语数外全能的老师,为学生提供服务,这个老师生病了,那全校停课。现在微服务流行后,学校有了数学教研组,语文教研组,外语教研组,每个教研组有一群老师具体负责某科的教学,缺了谁,学校都照样运转。

而这个变化中,那些改变历史的程序员就是把一个服务器中的众多服务,或好几台服务器中的众多服务,分类出来,解耦合出来,把他们类似的功能交给同一个集群来做,把互相耦合在一起的功能剥离出来,按业务,按功能来把他们作为一个个微服务放在服务器上,而这个服务器就只提供一个服务,或较少的服务。

让一个超大的服务逻辑,解耦合为一个个小服务,均匀的分布在各自的服务器中。微服务就微在这。每个教研组就是一个微服务集群。他们提供同样的服务,而注册中心Eureka就是这个存放这个教研组老师名单的地方,学生们想先访问这个注册中心获取教师名单,然后根据相应的负载方法去访问各自老师。不至于让集群中某一老师累死也不至于让某一老师闲死。

Zuul网关呢,就是学校的门卫,某些学生来学校找谁,它负责指引(路由),并且通过一些非常简单的配置,达到阻拦一些人进入(身份验证),或者控制想学数学的人只能去数学教研组,不能去核能教研组学怎么造原子弹(权限验证)。

Hystrix熔断器呢,可以把它当成学校的志愿者,当一个教研组集体罢课后,学生找不到老师了,这些志愿者及时的告诉来访问的学生,相应的结果,异常信息等,免得大量的学生在学校等待,这些志愿者赶快把这些等待的学生梳理出去,学生一直在学校等待,那其他需要学生的学校,也会等待学生,最后造成大面积的学校瘫痪。这里学生我们看成一个个请求。熔断器就是把某事故的蔓延即使熔断了。

当然这些组件也是微服务需要注册到Eureka注册中心

那 Spring Cloud 就可以看成是这个学校了。众多上面提到的组件相当于都是这个学校的各职能部门。

ps:  博主基于Maven+idea搭建。 另外SpringCloud需要基于springboot搭建。

2.1 引入Spring Boot相关依赖 这里的springboot用的是1.5.7版本

引入Spring Cloud相关依赖 这里为 Edgware.SR5

2.1 工程初始化配置

在Idea中创建工程:File -> New ->Project

 点击   Empty Project -> Next

 项目命名 -> 项目位置

 选择模组 modules ->next

 进入新的窗口后,开始配置Maven,打开设置 setting

 因为我之前做过配置,因此只需要改变框1的路径,如第一次配置需要自己找到你maven放置的位置,以及settings.xmlrepository的位置,实在不会的百度  maven集成idea

3个框选择完毕后点击 ok

接下来新建module

这里可能会出现加载不出archetype list的问题

 用了网上的所有解决办法花了3个小时解决都没用,重启之后竟然可以了····你敢信?????小时候网吧网管的至理名言都忘了!!重启一下嘛!!

出来之后 选择quickstart ->下一步

名字自己想 想好后,复制一下你想好的  ArtifactId点击Next,groupId为组织名 也是自己想一个,一般为公司网址反写。

 粘贴后下一步

 提供注册服务的服务器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>com.yun</groupId>
  <artifactId>springcloud-eureka-server</artifactId>
  <version>1.0-SNAPSHOT</version>
 
  <name>springcloud-eureka-server</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>
 
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>
 
  <!--引入springboot-parent父项目-->
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.7.RELEASE</version>
  </parent>
 
  <dependencies>
    <!--引入springcloud的euekea server依赖-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
 
  </dependencies>
 
 
  <!--指定下载源和使用springcloud的版本-->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Edgware.SR5</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>

 点击Import Changes 

等待右下角加载springcloud的依赖

 2.2 Springboot的搭建 以及提供注册服务 的 服务配置

创建resources文件夹

 并设置作为资源根目录,之后文件变成这样

之后文件夹变成有黄色的横杠

 在resources下新建文件,文件名为application.yml    (对是yml  不是xml ,博主第一次学习时,还以为是其他博主打错了,踩了一个小坑) 

 配置yml,注意:如果只配置前两行端口号信息会报错

server:
  port: 8700 # 端口自己决定
  
# 指定当前eureka客户端的注册地址,也就是eureka服务的提供方,当前配置的服务的注册服务方
eureka:
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
    register-with-eureka: false #自身 不在向eureka注册
    fetch-registry: false #启动时禁用client的注册
  instance:
    hostname: localhost
 
#指定应用名称
spring:
  application:
    name: eureka-server

知识补充:

 开发 spring boot 的入口类 EurekaServerApplication.java

 EurekaServerApplication.java

package com.yun;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
 
@SpringBootApplication
@EnableEurekaServer //当前使用eureka的server
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class,args);
    }
}

右键运行当前类:

运行成功console画面

 尝试进入eureka管理界面 端口号为 yml里配置的(端口号自己设置 需要大于公用和保留的端口号)1024~65535

一般我喜欢设置为 8700到8800之间

如下  管理界面已经可以登录了

 2.3 客户端client  提供真正服务的角色的配置, 它提供服务 在 服务注册方server (注册中心)进行注册

同样新建module,选择quickstart点击下一步

两个位置 置空

 取名 下一步

 注意这里要在根目录springcloud 下创建模组,content root 会默认在之前的模组之下创建模组 这样创建模组会出现问题并报错

推荐这种配置方法  在content root下springcloud后改名字   如下图配置点下一步,红框处一般默认为上一个模组的文件目录名,需要改为你的模组名

 成功后为并列状态,如不为并列或报错请重新配置

 配置servicesupport的pom,与server的pom配置相同,只需要把第一个pom的1的方框处server改为client

和第一个微服务同理 我们需要配置入口类 pom.xml  application.yml,因为是服务提供者,这里还需编写服务类controller

application.yml

server:
  port: 8701 # 服务提供方
 
# 指定当前eureka客户端的注册地址,
eureka:
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:8700/eureka
  instance:
    hostname: localhost
 
#当前服务名称
spring:
  application:
    name: eureka-service

pom.xml:

编写所提供的 服务controller

@RestController
@RequestMapping("/Hello")
public class Controller {
    @RequestMapping("/World")
    public String helloWorld(String s){
        System.out.println("传入的值为:"+s);
        return "传入的值为:"+s;
    }
}

入口类 并运行此微服务:

@SpringBootApplication
@EnableDiscoveryClient//代表自己是一个服务提供方
public class EurekaServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServiceApplication.class,args);
    }
}

 右键入口类名点击 run(当然开启此服务时需要先开启server服务 就是我们第一个编写的微服务)

 此时再进入服务注册的页面 http://localhost:8700/

可以看见服务提供者已被注册进 服务注册者

 在直接访问一下服务提供者的 网络位置http://localhost:8701/Hello/World?s=小沛

我们已经看见 可以访问了,证明此微服务可用。

 但是我们一般不直接调用所需的微服务,而是经过提供注册服务服务器server,获取所需的服务提供者列表(为一个列表,此列表包含了能提供相应服务的服务器),他们也许是个集群,因此server会返回一个 ip+端口号的表,服务消费者通过相应算法访问这表上的不同服务器,这些服务器提供的是相同的服务,这种在服务消费者一方挑选服务器为自己服务的方式是一种客户端的负载均衡。

目前博主所知的有 轮询随机两种方式 访问这些服务器,轮询就是循环的意思,假如有3台服务器,访问方式就是1,2,3,1,2,3,1,2,3····,随机就是随机,回想一下random方法,一种无规律的方式。这两种方式都是为了,访问每个服务器的可能性尽量的相同。还有权重负载这种算法,意思就是 根据服务器负载能力的分配相应的服务。能力大的干得多。能力小的干得少。

2.4 服务的调用方式

第一种调用方式:restTemplate+ribbon     

 第二种调用方式:feign 

 2.4.1 restTemplate+ribbon   

ribbon是一种负载均衡的客户端,它是什么呢?请详读https://www.jianshu.com/p/1bd66db5dc46

可以看见其中的一段如下:

客户端负载均衡服务端负载均衡最大的不同点在于上面所提到服务清单所存储的位置。在客户端负载均衡中,所有客户端节点都维护着自己要访问的服务端清单,而这些服务端端清单来自于服务注册中心,比如上一章我们介绍的Eureka服务端。

同服务端负载均衡的架构类似,在客户端负载均衡中也需要心跳去维护服务端清单的健康性,默认会创建针对各个服务治理框架的Ribbon自动化整合配置,比如Eureka中的org.springframework.cloud.netflix.ribbon.eureka.RibbonEurekaAutoConfiguration,Consul中的org.springframework.cloud.consul.discovery.RibbonConsulAutoConfiguration。在实际使用的时候,我们可以通过查看这两个类的实现,以找到它们的配置详情来帮助我们更好地使用它。

接下来我们来搭建基于ribbon的客户端,他用于消费服务。

同理先搭建springboot的环境

与之前搭建servicesupport不同的是:

第一步:现在pom中需要在dependencies中添加ribbon依赖

<dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

第二步:yml如下配置:

server:
  port: 8702 # 服务消费方
 
# 指定当前eureka客户端的注册地址,
eureka:
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:8700/eureka
  instance:
    hostname: localhost
 
#当前服务名称
spring:
  application:
    name: eureka-consumer

 服务的消费方依旧需要在注册方8700端口去注册。配置当前服务消费方的端口8072,名字为eureka-consumer

第三步:依旧需要启动类,因为它是一个springboot的架构:

@SpringBootApplication
@EnableDiscoveryClient //当前使用eureka的server
public class EurekaConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaConsumerApplication.class,args);
    }
}

 如上图:

我们需要一个controller类来编写ribbon的代码。

@RestController
@RequestMapping("/Hello")
class ConsumerController {
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    @Autowired
    private RestTemplate restTemplate;
    @RequestMapping("/Consumer")
    public String helloWorld(String s){
        System.out.println("传入的值为:"+s);
        //第一种调用方式
        //String forObject = new RestTemplate().getForObject("http://localhost:8071/Hello/World?s=" + s, String.class);
 
        //第二种调用方式
        //根据服务名 获取服务列表 根据算法选取某个服务 并访问某个服务的网络位置。
        //ServiceInstance serviceInstance = loadBalancerClient.choose("EUREKA-SERVICE");
        //String forObject = new RestTemplate().getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/Hello/World?s="+s,String.class);
 
        //第三种调用方式 需要restTemplate注入的方式
        String forObject = restTemplate.getForObject("http://EUREKA-SERVICE/Hello/World?s=" + s, String.class);
        return forObject;
    }
}

我们常用第三种调用方式。

第一种是直接调用:不经过注册中心那服务列表,直接访问的servicesupport

第二种:是根据服务名选择调用,如上图需要做如下注入   

    @Autowired
    private LoadBalancerClient loadBalancerClient;

如上图代码中第二种调用方法的代码所示。

用服务名去注册中心获取服务列表,当前客户端底层会做随机算法的选取获得服务并访问。

第三种需要一个@Bean的注解自动注入并直接调用restTemplate对象调用服务。底层调用模式与第二种调用方式一样。如下:

@Configuration
public class Beans {
    //管理简单对象
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

@Bean注解告诉工厂,这个方法需要自动注入。

@LoadBalanced,表示需要做负载匀衡。

然后如controller中一样注入一下restTemplate,并且使用他,区别是可以直接使用服务名访问了

String forObject = 

restTemplate.getForObject("http://EUREKA-SERVICE/Hello/World?s=" + s, String.class);

 开始测试:

1.运行server的启动类:

 2.运行servicesupport的启动类:

 3.运行serviceconsume的启动类:

 浏览器访问:

 8072为服务消费方的端口

 访问方法解析:

  • 访问服务消费方@RequestMapping指定的路径及消费方的端口来访问消费方的controller

  • controller根据服务名去server方获取获取服务列表,获取服务列表后根据随机的模式负载匀衡后去选择服务地址去访问servicesupport:如下图

2.5   Eureka server的高可用配置

点击下图配置

接下来配置三台01,02,03的虚拟机参数

01:8699

 02:8698

 03:8697 

 之后点ok保存,可看见多出三个启动项

 接下来分别改注册端口号,defaultZone分别启动三个启动项

打开server的yml配置,删掉前两行端口号配置(图中有错,请把instance 和hostname那两行删掉)

 配置好yml后点击启动 

 同理,我们再次改动端口号为8699和8697后,把启动项改为02,之后启动(图中有错,请把instance 和hostname那两行删掉)

 同理把yml端口改为8699 和 8698后,把启动项改为03,之后启动(图中有错,请把instance 和hostname那两行删掉) 

 启动后分别访问三个01,02,03端口,已经可以看见可以访问了。


 打开服务提供方的yml配置如下,把端口号改为三个中其中的一个。

 启动服务提供方之后,再次访问三个01,02,03我们会发现

重点:即使服务提供方只注册了一个端口号8699,但是另外两个端口号,也能感知到服务提供方8701的存在了。如下图:


 接下来像服务消费方中添加服务注册者的端口号,这样在server挂掉任何一个的时候,都能有其他的server也能获取服务列表

 访问以下服务消费方,发现可以通过消费方调用server服务列表并且访问service了

 我么随便关闭其中两个server的副本,重启serviceconsume,再进行访问。必须重启serviceconsume才能清空缓存,清掉consume里面有的服务列表。

 上图发现即使关闭两台server后依旧可以访问,如下图,依旧从server中获取了服务列表,从中也能看见之后不用再获取服务列表了。

 但是当我们关掉所有server后。访问还是没问题,因为缓存了服务列表。

 但是让我们来重启一下serviceconsume,再访问就不行了。

综上我们就完成了springcloud中server的高可用配置

- END -

最近整理一份面试资料《Java技术栈学习手册》,覆盖了Java技术、面试题精选、Spring全家桶、Nginx、SSM、微服务、数据库、数据结构、架构等等。获取方式:点“ 在看,关注公众号 Java后端 并回复 777 领取,更多内容陆续奉上。推荐阅读 1. Spring Cloud 常见面试题(2020最新版)2. 图文并茂:HashMap经典详解!3. 21 届校招薪资曝光:严重倒挂老员工!4. Linux 命令速查手册5. 讨论:Service层需要接口吗?喜欢文章,点个在看 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从零搭建 Spring Cloud 服务(超级详细) 的相关文章

  • 使用 HttpUrlConnection Android 将 base64 编码的图像发送到服务器

    我正在尝试使用 HttpUrlConnection 将 base64 编码的图像发送到服务器 我遇到的问题是大多数图像均已成功发送 但有些图像会生成 FileNotFound 异常 我的图像编码代码可以在下面找到 public static
  • MongoTemplate upsert - 从 pojo 进行更新的简单方法(哪个用户已编辑)?

    这是一个简单的 pojo public class Description private String code private String name private String norwegian private String en
  • jvm 次要版本与编译器次要版本

    当运行使用具有相同主要版本但次要版本高于 JVM 的 JDK 编译的类时 JVM 会抛出异常吗 JDK 版本并不重要 类文件格式版本 http blogs oracle com darcy entry source target class
  • 使用 ChannelExec 的命令未执行 - Jsch

    我正在使用 Jsch 在服务器中创建一个文件并执行一些命令 对于文件创建 它工作正常 但是对于命令执行 则不然 它保持状态 1 仍在处理它 并永远保持该状态 这种情况发生在 shell 执行或我尝试成为 root 时 请按照以下方法操作 p
  • 如何导入 org.apache.commons.lang3.ArrayUtils;进入 Eclipse [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我如何导入 org apache commons lang3 ArrayUtils 将库添加到 Ecl
  • 容器中的 JVM 计算处理器错误?

    最近我又做了一些研究 偶然发现了这一点 在向 OpenJDK 团队抱怨之前 我想看看是否有其他人观察到这一点 或者不同意我的结论 因此 众所周知 JVM 长期以来忽略了应用于 cgroup 的内存限制 众所周知 现在从 Java 8 更新某
  • 如何在 Eclipse 中使用其他外部 jar 依赖项创建不可运行/不可执行的 jar

    我无法通过 Eclipse 导出向导创建普通的 jar 不可运行 不可执行 它仅创建 jar 文件 但不会导出依赖的 jar 从而在从其他类调用导出的 jar 的方法时出现错误 请帮助 非常感谢 kurellajunior的建议 它是通过使
  • Intellij 中的 Google OR-Tools:UnsatisfiedLinkError

    我正在建立一个应该使用 Google OR Tools 的 java 框架 下面的代码编译成功 但在运行时抛出异常 Exception in thread main java lang UnsatisfiedLinkError com go
  • 异步迭代器

    我有以下代码 while slowIterator hasNext performLengthTask slowIterator next 由于迭代器和任务都很慢 因此将它们放入单独的线程中是有意义的 这是对迭代器包装器的快速而肮脏的尝试
  • Jenkins 的代码覆盖率 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Java:java.util.ConcurrentModificationException

    我正在制作 2D 目前正在研究用子弹射击 子弹是一个单独的类 所有项目符号都存储在称为项目符号的数组列表中 当它超出屏幕一侧 Exception in thread main java util ConcurrentModification
  • 创建正则表达式匹配数组

    在Java中 我试图将所有正则表达式匹配返回到一个数组 但似乎您只能检查模式是否匹配某些内容 布尔值 如何使用正则表达式匹配来形成与给定字符串中的正则表达式匹配的所有字符串的数组 4城堡的回答 https stackoverflow com
  • 如何将 arraylist 从 servlet 传递到 javascript?

    我通过在属性中设置数组列表并将其转发到 jsp 来从 servlet 传递数组列表 Servlet ArrayList
  • 如何在Java媒体框架中学习.wav持续时间?

    我正在尝试使用 java 媒体框架将 mov 文件与 wav 文件合并 因此我需要知道它们的持续时间 我怎样才能做到这一点 任何想法 将不胜感激 您可以使用以下方式了解声音文件的持续时间 即 VitalyVal 的第二种方式 import
  • Hibernate HQL:将对值作为 IN 子句中的参数传递

    我面临一个问题 如何使用 IN 子句将查询中的成对值的参数传递给 HQL 例如 select id name from ABC where id reg date in x y 并且参数是不同的数据类型string id 和reg date
  • 了解 Spark 中的 DAG

    问题是我有以下 DAG 我认为当需要洗牌时 火花将工作划分为不同的阶段 考虑阶段 0 和阶段 1 有些操作不需要洗牌 那么为什么 Spark 将它们分成不同的阶段呢 我认为跨分区的实际数据移动应该发生在第 2 阶段 因为这里我们需要cogr
  • Java:由 HTTP 连接创建的等待连接线程存活时间很长

    我有一个服务器端代码 用于检查 SOAP 服务是否已启动 代码如下 String response while response length 0 try final URL url new URL DummySoapServiceURL
  • 公共方法与公共 API

    在干净的代码书中 有一个观点是 公共 API 中的 Javadocs 同样 Effective java 一书也有这样的内容 项目 56 为所有公开的 API 元素编写文档注释 所以这就是我的问题 所有公共方法都被视为公共 API 吗 它们
  • java.lang.ClassNotFoundException:com.fasterxml.jackson.core.JsonProcessingException

    我在用着templateRest发布User反对Rest Server但我遇到了以下错误 线程 main java lang NoClassDefFoundError 中出现异常 com fasterxml jackson core Jso
  • 如何在不同版本的Google App Engine中使用自定义域名?

    我使用谷歌应用程序引擎作为我的 Android 和 Web 应用程序的服务器 我使用 Android Studio 开发了 Android 应用程序 并使用 Eclipse 开发了 Web 应用程序 我在应用程序引擎中部署了两个版本 第一个

随机推荐

  • easyui tabs 一个窗口修改完成后刷新另一个窗口

    在一个tab中添加或删除数据后 要改变主页 相当于链接的另一个tab 的内容 1 在要刷新的窗口的初始化中添加 js 刷新方法 并保存到 window top 中 window top Refresh CloudHomePage Conte
  • 二、基础平滑、面积折线图与折线堆叠、面积堆叠《手把手教你 ECharts 数据可视化详解》

    注 本系列教程需要对应 JavaScript html css 基础 否则将会导致阅读时困难 本教程将会从 ECharts 的官方示例出发 详解每一个示例实现 从中学习 ECharts ECharts 官方示例 https echarts
  • Mybatis学习(二)--getMapper接口绑定方案和多参数传值

    在Mybatis的基础使用中 如果想向一个sql语句中传递多个参数 只能将parameterType设置为某个类或者Map 不能直接传入多个参数 接口绑定方案可以实现直接传入多个参数 Mybatis的接口绑定方案与基本的使用方法不同的地方在
  • unity 射线获取坐标

    射线 碰到障碍物就会断开 鼠标点击屏幕获得一个二维坐标 通过相机的射线转换为三维世界坐标 private Vector3 worldPos 鼠标点击的点所对应的世界里面的位置 点击鼠标右键 if Input GetMouseButton 1
  • ThinkPHP文件包含漏洞分析

    出品 长白山攻防实验室 ID A Tree 0x00 声明 以下内容 来自长白山攻防实验室的A Tree作者原创 由于传播 利用此文所提供的信息而造成的任何直接或间接的后果和损失 均由使用者本人负责 长白山攻防实验室以及文章作者不承担任何责
  • Vue3集成高德地图方法

    1 注册高德开发者账号 获取key和安全密钥 2 下载依赖 可参考高德官方文档 https lbs amap com api jsapi v2 guide webcli map vue1 npm i amap amap jsapi load
  • GD32f103 8M晶振改12M , 要修改的地方

    手里的单片机是gd32f103ret6 晶振和官方库默认的8M不一致 导致串口乱码 网上找了好久全是STM32的例子 不过还是有参考意义的 以下是gd32f10x 的设置方式 1 Keil中的Target设置 PS 这一项好像会自动设置 安
  • 7、变量进阶

    7 变量进阶 理解 目标 变量的引用 可变和不可变类型 局部变量和全局变量 01 变量的引用 变量 和 数据 都是保存在 内存 中的 在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的 1 1 引用的概念 在 Py
  • [论文阅读]《how to share a secret》

    how to share a secret Adi Shamir 文章主要讲了如何将数据D分为n份 任意k份可以重组成D 任意k 1份不会泄露任何关于D的信息 这种技术能为密码系统构建鲁棒的密钥管理机制 即使灾难破坏一半信息或者安全性被破坏
  • 浅谈C++

    引子 程序运行时产生的数据都属于临时数据 程序一旦运行结束都会被释放通过文件可以将数据持久化 C 中对文件操作需要包含头文件 lt fstream gt C 提供了丰富的文件操作功能 你可以使用标准库中的fstream库来进行文件的读取 写
  • 【接口测试】POST请求提交数据的三种方式及Postman实现

    1 什么是POST请求 POST请求是HTPP协议中一种常用的请求方法 它的使用场景是向客户端向服务器提交数据 比如登录 注册 添加等场景 另一种常用的请求方法是GET 它的使用场景是向服务器获取数据 2 POST请求提交数据的常见编码格式
  • 【从零到一的Raspberry】数莓派踩坑实录(二) 内核编译配置和模块安装

    写在前面 本次作业具有挑战性 不过不管哪一环节出错了 你都要知道如何把它还原到初始状态 这样你就不是在危险地操作 而有还原的保障 因此在第0节我会介绍一种还原数莓派系统的方法 这样你就可以在内核无法运行时还原到默认系统 后面从第一章开始 带
  • AD 利用IPC封装创建向导快速创建封装

    首先在扩展更新里查看是否有IPC封装 工具里面第二个会有很多常见封装类型 选择SOP NEXT 会填写一些数据 相对应在数据手册上进行填写即可 下图左上角问的是要不要加散热焊盘 散热焊盘主要看原件是否真实需要 上图要填的值一般来说默认就可以
  • Ubuntu无法连接网络?

    文章目录 适用情况 Windows网络配置和虚拟机网络配置 Windows网络适配器配置 Ubuntu设置静态IP 图形化界面操作 指令文件操作 如果重新设置好以后 依旧不行 适用情况 如果您无法知晓 虚拟机出现是什么问题 始终就是无法连接
  • 黑盒测试的范围内容

    1 功能错误或遗漏 2 界面错误 3 数据结构或外部数内容据库访问错误 4 性能错误 5 初始化和终止错误
  • 动态规划(js版)

    1 动态规划算法介绍 理解动态规划 知乎好文 LeetCode简单的动态规划题 斐波那契数 爬楼梯 使用最小花费爬楼梯 有点小坑 不同路径 不同路径 II 注意初始值的设置 最小路径和 LeetCode较难的动态规划题 343 整数拆分 9
  • 哈希(Hash)与算法的衡量

    对于map来说 背后就是平衡搜索二叉树 具体可见 https blog csdn net weixin 42513339 article details 88889306 空间复杂度为 O logN 对于unorder map来说 背后就是
  • ubuntu18.04安装xmind思维导图 + 创建软件的快捷方式

    ubuntu18 04安装xmind思维导图 sh文件运行小知识 创建快捷方式 1 下载linux版本的 zip压缩包 2 运行sudo setup sh 2 1 sh 文件相关知识 补充 3 启动xmind 3 1 启动失败 font f
  • ggplot2中的条形图 geom_bar()

    20150226 1 ggplot 能直接计算aes 中x变量各个分类的数目 所以可以直接用原始数据 而不用像plot 一样要table 数据 2 geom bar mapping NULL data NULL stat bin posit
  • 从零搭建 Spring Cloud 服务(超级详细)

    点击上方 Java后端 选择 设为星标 优质文章 及时送达 作者 Anakki 链接 blog csdn net qq 29519041 article details 85238270 这里会介绍很多基础知识 直接想开始搭建微服务的可以看