Nacos学习笔记 (8)服务发现基础应用

news2024/11/26 0:52:32

1. 什么是服务发现

在微服务架构中,整个系统会按职责能力划分为多个服务,通过服务之间协作来实现业务目标。这样在我们的代码中免不了要进行服务间的远程调用,服务的消费方要调用服务的生产方,为了完成一次请求,消费方需要知道服务生产方的网络位置(IP地址和端口号)

我们的代码可以通过读取配置文件的方式读取服务生产方网络位置,如下:

 我们通过Spring boot技术很容易实现:

Service B(服务生产者)

Service B是服务的生产方,暴露/service服务地址,实现代码如下:

package com.nacos;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class SpringRestProviderApplication {

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

    @GetMapping(value = "/service") //暴露服务
    public String service(){
        return "provider invoke";
    }

}

配置文件:

server.port = 56010

Service A(服务消费者)

实现代码:

@SpringBootApplication
@RestController
public class SpringRestConsumerApplication {

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

    @Value("${provider.address}")
    private String providerAddress;
    @GetMapping(value = "/service")
    public String service(){
        RestTemplate restTemplate = new RestTemplate();
//调用服务
        String providerResult = restTemplate.getForObject("http://" + providerAddress +
                "/service",String.class);
        return "consumer invoke | " + providerResult;
    }
}

配置文件:

# 应用名称
spring.application.name=SpringRestConsumer
# 应用服务 WEB 访问端口
server.port = 56020
# 服务生产方地址
provider.address = 127.0.0.1:56010

访问 127.0.0.1:56020/service , 输出以下内容:

consumer invoke | provider invoke

看上去很完美,但是,仔细考虑以下,此方案对于微服务应用而言行不通。

首先,微服务可能是部署在云环境的,服务实例的网络位置或许是动态分配的。另外,每一个服务一般会有多个实例来做负载均衡,由于宕机或升级,服务实例网络地址会经常动态改变。再者,每一个服务也可能应对临时访问压力增加新的服务节点。正如下图所示:

 基于以上的问题,服务之间如何相互感知?服务如何管理?这就是服务发现的问题了。如下图:

上图中服务实例本身并不记录服务生产方的网络地址,所有服务实例内部都会包含服务发现客户端

1)在每个服务启动时会向服务发现中心上报自己的网络位置。这样,在服务发现中心内部会形成一个服务注册表服务注册表是服务发现的核心部分,是包含所有服务实例的网络地址的数据库。

2服务发现客户端会定期从服务发现中心同步服务注册表 ,并缓存在客户端。

3)当需要对某服务进行请求时,服务实例通过该注册表,定位目标服务网络地址。若目标服务存在多个网络地址,则使用负载均衡算法从多个服务实例中选择出一个,然后发出请求。

总结一下,在微服务环境中,由于服务运行实例的网络地址是不断动态变化的,服务实例数量的动态变化 ,因此无法使用固定的配置文件来记录服务提供方的网络地址,必须使用动态的服务发现机制用于实现微服务间的相互感。各服务实例会上报自己的网络地址,这样服务中心就形成了一个完整的服务注册表,各服务实例会通过服务发现中心来获取访问目标服务的网络地址,从而实现服务发现的机制。

2. Nacos 服务发现

将演示如何使用Spring Cloud Alibaba Nacos DiscoverySpring cloud 应用程序与 Nacos 的无缝集成。通过一些原生的spring cloud注解,我们可以快速来实现Spring cloud微服务的服务发现机制,并使用Nacos Server作为服务发现中心,统一管理所有微服务.

2.1 Spring Cloud 服务协作流程

Spring Cloud 常见的集成方式是使用Feign+Ribbon技术来完成服务间远程调用及负载均衡的,如下图:

1)在微服务启动时,会向服务发现中心上报自身实例信息,这里ServiceB 包含多个实例。

每个实例包括:IP地址、端口号信息。

2)微服务会定期从Nacos Server(服务发现中心)获取服务实例列表。

3)当ServiceA调用ServiceB时,ribbon组件从本地服务实例列表中查找ServiceB的实例,如获取了多个实例如Instance1Instance2。这时ribbon会通过用户所配置的负载均衡策略从中选择一个实例。

4)最终,Feign组件会通过ribbon选取的实例发送http请求。

采用Feign+Ribbon的整合方式,是由Feign完成远程调用的整个流程。而Feign集成了RibbonFeign使用Ribbon完成调用实例的负载均衡。

2.1.1 负载均衡的概念

SpringCloud服务协议流程中,ServiceA通过负载均衡调用ServiceB,下边来了解一下负载均衡

负载均衡就是将用户请求(流量)通过一定的策略,分摊在多个服务实例上执行,它是系统处理高并发、缓解网络压力和进行服务端扩容的重要手段之一。它分为服务端负载均衡客户端负载均衡

服务器端负载均衡:

在负载均衡器中维护一个可用的服务实例清单,当客户端请求来临时,负载均衡服务器按照某种配置好的规则(载均衡算法)从可用服务实例清单中选取其一去处理客户端的请求。这就是服务端负载均衡。

例如 Nginx ,通过 Nginx 进行负载均衡,客户端发送请求至 Nginx Nginx 通过负载均衡算法,在多个服务器之间选择一个进行访问。即在服务器端再进行负载均衡算法分配。

客户端服务负载均衡:

我们接下来要讲的Ribbon,就属于客户端负载均衡。在ribbon客户端会有一个服务实例地址列表,在发送请求前通过负载均衡算法选择一个服务实例,然后进行访问,这是客户端负载均衡。即在客户端就进行负载均衡算法分配。

Ribbon是一个客户端负载均衡器,它的责任是从一组实例列表中挑选合适的实例,如何挑选?取决于负载均衡策

Ribbon核心组件IRule是负载均衡策略接口,它有如下实现,大家仅做了解:

  • RoundRobinRule(默认):轮询,即按一定的顺序轮换获取实例的地址。
  • RandomRule:随机,即以随机的方式获取实例的地址。
  • AvailabilityFilteringRule: 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,以及并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问;
  • WeightedResponseTimeRule: 根据平均响应时间计算所有服务的权重,响应时间越快,服务权重越大,被选中的机率越高;  刚启动时,如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够时,会切换到WeightedResponseTimeRule
  • RetryRule: 先按照RoundRobinRule的策略获取服务,如果获取服务失败,则在指定时间内会进行重试,获取可用的服务;
  • BestAvailableRule: 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务;
  • ZoneAvoidanceRule: 默认规则,复合判断server所在区域的性能和server的可用性选择服务器;

可通过下面方式在spring boot 配置文件中修改默认的负载均衡策略:

account‐service.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

account-service 是调用的服务的名称,后面的组成部分是固定的。

2.1.2 Feign 介绍

FeignNetflflix开发的声明式、模板化的HTTP客户端,Feign可以帮助我们更快捷、优雅地调用HTTP APIFeign的英文表意为假装,伪装,变形可以理解为将HTTP报文请求方式伪装为简单的java接口调用方式。

参考前面ServiceA调用ServiceB的例子,我们使用Feign实现这个过程,代码如下:

Service B暴露"/service"服务端点,如下:

@SpringBootApplication
@RestController
public class SpringRestProviderApplication {

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

    @GetMapping(value = "/service") //暴露服务
    public String service(){
        return "provider invoke";
    }
}

Feign 调用方式如下:

1)声明Feign客户端

@FeignClient(value = "serviceB")
public interface ServiceBAgent {
    /**
    * 根据用户名查询账号信息
    * @param username 用户名
    * @return 账号信息
    */
    @GetMapping(value = "/service")
        public String service();
    }
}

2)业务调用

@Autowired
private ServiceBAgent serviceBAgent.;
//....略
serviceBAgent.service();
//....略

由上面的代码可以看出, 使用 Feign 的实现更简单。并且在业务调用时,减少了与业务无关的http请求相关代码的编写,使业务逻辑清晰。咱们分析一下Feign帮我们做了哪些事儿:

  • 声明Feign客户端 之后,Feign会根据@FeignClient注解使用java的动态代理技术生成代理类,在这里我们指定@FeignClient valueserviceB,则说明这个类的远程目标为spring cloud的服务名称为serviceB的微服务。
  • serviceB的具体访问地址,Feign会交由ribbon获取,若该服务有多个实例地址,ribbon会采用指定的负载均衡策略选取实例。
  • Feign兼容springweb注解(如:@GetMapping),它会分析声明Feign客户端方法中的Spring注解,得出Http请求method、参数信息以及返回信息结构。
  • 当业务调用Feign客户端方法时,会调用代理类,根据以上分析结果,由代理类完成实际的参数封装、远程http请求,返回结果封装等操作。

另外,别忘了,若在在Spring cloud中使用Feign,需要引入以下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring‐cloud‐starter‐openfeign</artifactId>
</dependency>

Feign默认集成了Ribbon,可以直接使用。

还需要在spring cloud 启动类中标注@EnableFeignClients,表明此项目开启Feign客户端:

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class SpringRestConsumerBootstrap {

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

总结:通过上面的学习,我们已经了解Spring cloud的微服务是如何协作的,通过哪些组件的配合能够完成服务间协作?我们了解了什么是负载均衡,Feign用于服务间Http调用,Ribbon用于执行负载均衡算法选取访问实例,而Ribbon的实例列表来源是由Spring cloud的服务发现中心提供(当前实现为Nacos)。

3. 生产者、消费者案例

3.1 搭建父工程

为了规范依赖的版本,这里创建父工程,指定依赖的版本。父工程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.nacos</groupId>
    <artifactId>nacos-discovery</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>quickstart-provider</module>
        <module>quickstart-consumer</module>
    </modules>
    <packaging>pom</packaging>

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

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.3.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

3.2 服务生产者

以下步骤演示了如何将一个服务生产者注册到 Nacos

(1)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>nacos-discovery</artifactId>
        <groupId>org.nacos</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>quickstart-provider</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>
</project>

(2)application.yml 配置

一些关于 Nacos 基本的配置也必须在application.yml(也可以是application.properties)配置,如下所示:application.yml

server:
  port: 56010
spring:
  application:
    name: quickstart-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
logging:
  level:
    root: info
    org.springframework: info

Note: spring.cloud.nacos.discovery.server-addr 指定了Nacos Server的网络地址和端口号。

(3)Provider(生产者)服务实现

package com.nacos.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author wushaopei
 * @create 2022-12-25 11:04
 */
@RestController
public class ProviderController {

    private static final Logger LOG = LoggerFactory.getLogger(ProviderController.class);

    @GetMapping("/service")
    public String service(){
        LOG.info("provider invoke");
        return "provider invoke";
    }
}

(4)启动Provider(生产者)

/**
 * @author wushaopei
 * @create 2022-12-25 11:06
 */
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class NacosProviderApp {

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

Note: @EnableDiscoveryClient spring cloud项目中表明此项目是一个注册发现客户端,这里注册服务发现使用的是Nacos

Note: @EnableFeignClients 开启FeignClient

3.3 服务消费者

以下步骤演示了如何结合Nacosspring cloud rest接口进行消费。

(1) 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>nacos-discovery</artifactId>
        <groupId>org.nacos</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>quickstart-consumer</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>
</project>

(2)application.yml 配置

server:
  port: 56020
spring:
  application:
    name: quickstart-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
logging:
  level:
    root: info
    org.springframework: info

(3)Provider(生产者)远程代理定义

@FeignClient(name = "quickstart-provider")
public interface ProviderClient {

    @GetMapping("/service")
    String service();
}

(4)Consumer(消费者)服务实现

@RestController
public class ConsumerController {

    private static final Logger LOG = LoggerFactory.getLogger(ConsumerController.class);

    @Autowired
    private ProviderClient providerClient;

    @GetMapping("/service")
    public String service(){
        LOG.info("consumer invoke");
        String providerResult = providerClient.service();
        return "consumer invoke" + "|" + providerResult;
    }
}

(5)启动Consumer(消费者)

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class NacosConsumerApp {

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

访问地址:http://127.0.0.1:56020/service

调用成功。

浏览器访问 http://127.0.0.1:8848/nacos ,打开nacos控制台,并点击菜单服务管理->服务列表,可展示出刚刚注册的两个服务:

 3.4 测试多实例负载均衡

修改quickstart-provider工程的application.yaml,实现port动态传入:

server:
  port: ${port:56010} #启动端口

设置启动参数:

启动quickstart-provider两个实例。

请求http://127.0.0.1:56020/service测试负载均衡。

跟踪quickstart-provider两个实例的控制台的日志输出,默认负载均衡策略是轮询。

4. 服务发现基础应用

4.1 服务发现数据模型

Nacos在经过阿里内部多年生产经验后提炼出的数据模型,则是一种服务-集群-实例的三层模型,这样基本可以满足服务在所有场景下的数据存储和管理。

 

命名空间(Namespace)

用于进行租户粒度的配置隔离,命名空间不仅适用于nacos的配置管理,同样适用于服务发现。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

服务

提供给客户端的软件功能,通过预定义接口网络访问。

服务名

服务提供的标识,通过该标识可以唯一确定其指代的服务。

实例

提供一个或多个服务的具有可访问网络地址(IP:Port)的进程,启动一个服务,就产生了一个服务实例。

元信息

Nacos数据(如配置和服务)描述信息,如服务版本、权重、容灾策略、负载均衡策略、鉴权配置、各种自定义标(label),从作用范围来看,分为服务级别的元信息、集群的元信息及实例的元信息。

集群

服务实例的集合,服务实例组成一个默认集群, 集群可以被进一步按需求划分,划分的单位可以是虚拟集群,相同集群下的实例才能相互感知。

应用通过NamespaceServiceCluster(DEFAULT)的配置,描述了该服务向哪个环境(如开发环境)的哪个集群注册实例。

spring:
  application:
    name: transaction-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:7283 # 注册中心地址
        namespace: a1f8e863‐3117‐48c4‐9dd3‐e9ddc2af90a8 # 开发环境
        cluster‐name: DEFAULT # 默认集群,可不填写

Note: 集群作为实例的隔离,相同集群的实例才能相互感知。

Note: namespacecluster-name若不填写都将采取默认值,namespace的默认是public命名空间,cluster-name的默认值为DEFAULT集群。

4.2 服务管理

开发者或者运维人员往往需要在服务注册后,通过友好的界面来查看服务的注册情况,包括当前系统注册的所有服务和每个服务的详情。并在有权限控制的情况下,进行服务的一些配置的编辑操作。Nacos在目前最新版本开放的控制台的服务发现部分,主要就是提供用户一个基本的运维页面,能够查看、编辑当前注册的服务,这些功能集中Nacos控制台的服务管理一级菜单内。

(1)服务列表管理

服务列表帮助用户以统一的视图管理其所有的微服务以及服务健康状态。整体界面布局是左上角有服务的搜索框和搜索按钮,页面中央是服务列表的展示。服务列表主要展示服务名、集群数目、实例数目、健康实例数目和详情按钮五个栏目。

 在服务列表页面点击详情,可以看到服务的详情。可以查看服务、集群和实例的基本信息。

(2)服务流量权重支持及流量保护

Nacos 为用户提供了流量权重控制的能力,同时开放了服务流量的阈值保护,以帮助用户更好的保护服务服务提供者集群不被意外打垮。如下图所以,可以点击实例的编辑按钮,修改实例的权重。如果想增加实例的流量,可以将权重调大,如果不想实例接收流量,则可以将权重设为0

(3)服务元数据管理

Nacos提供多个维度的服务元数据的暴露,帮助用户存储自定义的信息。这些信息都是以K-V的数据结构存储,在控制台上,会以k1=v1,k2=v2这样的格式展示。类似的,编辑元数据可以通过相同的格式进行。例如服务的元数据编辑,首先点击服务详情页右上角的编辑服务按钮,然后在元数据输入框输入:version=1.0

点击确认,就可以在服务详情页面,看到服务的元数据已经更新了。

 (4)服务优雅上下线

Nacos还提供服务实例的上下线操作,在服务详情页面,可以点击实例的上线或者下线按钮,被下线的实例,将不会包含在健康的实例列表里。

上下线测试:

1)分别启动快速上手中的quickstart-consumerquickstart-provider工程,更改quickstart-provide中的启动端口,再次启动quickstart-provider,让quickstart-provider服务拥有两个实例。

2)多次访问http://127.0.0.1:56020/service ,让consumer调用provider时触发负载均衡。

3)观察provider2个实例控制台,可发现实例调用被均匀负载。

4)在provider的服务详情页面,让某实例下线。

5)多次访问http://127.0.0.1:56020/service ,观察控制台,发现下线的实例已不再接收流量。

6)在provider的服务详情页面,让该实例恢复上线状态。

7)多次访问http://127.0.0.1:56020/service ,观察控制台,发现恢复上线的实例已恢复流量访问。

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

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

相关文章

求空间曲线的切线,法平面

求空间曲线的切线&#xff0c;法平面&#xff1a;归结为求空间曲线的切向量 进而用点向式直线方程表示出切线&#xff0c;点法式方程表示出法平面 情况一&#xff1a;空间曲线以参数式给出&#xff0c;求切向量时直接求导即可&#xff0c;如下题 情况二&#xff1a;空间曲线…

ROS2 基础概念 话题

ROS2 基础概念 话题1. Topics2. rqt_graph3. 话题4. 话题类型5. 话题发布6. 话题频率1. Topics 话题是节点交换消息的总线 节点可以向任意数量的话题发布数据&#xff0c;并同时订阅任意数量的话题 2. rqt_graph 将使用rqt_graph来可视化不断变化的节点和话题&#xff0c;以…

云服务器ECS入门及云上网站部署

云服务器ECS入门及云上网站部署 一、什么是云服务器ECS 云服务器ECS (Elastic Compute Service) 是阿里云提供的性能卓越、稳定可靠、弹性扩展的laaS(Infrastructure as a Service) 级别云计算服务 云服务器ECS免去了您采购IT硬件的前期准备&#xff0c;让您像使用水、电、天…

JavaScript操作BOM对象

BOM&#xff1a;浏览器对象模型 window代表浏览器窗口 >window.alert(1) undefined >window.innerHeight //浏览器内部高度 242 >window.innerWidth 1229 >window.outerHeight //浏览器外部高度 824 >window.outerWidth 1536 Navigator&#xff0c;封装了浏…

【Linux】第六部分 远程登录

【Linux】第六部分 远程登录 文章目录【Linux】第六部分 远程登录6. 远程登录6.1 配置hosts映射文件6.2 xshell和xftp的使用总结6. 远程登录 6.1 配置hosts映射文件 为什么要配置呢?利于后续我们进行连接方便,就比如:我们没有办法记住很多手机号,但是我们可以记住人名,我们打…

【20221225】【剑指1】链表

1、从尾到头打印链表 可以用rbegin&#xff0c;rend&#xff1b;也可以用reverse翻转数组。 2、如果是翻转链表的话&#xff08;双指针法&#xff0c;用虚拟头节点依次翻转&#xff09;&#xff1a;https://blog.csdn.net/HYAIWYH/article/details/127118468?ops_request_mi…

java ssm 摄影约拍系统的设计

目录 第一章 绪论 5 1.1 研究背景 5 1.2系统研究现状 5 1.3 系统实现的功能 6 1.4系统实现的特点 6 1.5 本文的组织结构 6 第二章开发技术与环境配置 7 2.1 Java语言简介 7 2.2JSP技术 8 2.3 MySQL环境配置 8 2.4 MyEclipse环境配置 9 2.5 mysql数据库介绍 9 2.6 B/S架构 9 第三…

6、集合介绍

文章目录6、集合6.1 介绍6.2 常用接口和类6.3 ArrayList6.3.1 介绍6.3.2 基本操作6.3.3 常用方法6.4 LinkedList6.4.1 基本操作6.4.2 常用方法6.5 泛型6.5.1 介绍6.5.2 基本使用6.6 比较器6.7 ArrayList和LinkedList的比较6.8 HashSet6.8.1 介绍6.8.2 常用方法6.8.3 重复数据6.…

Attetion is all you need论文阅读笔记

Attetion is all you need 参考&#xff1a;沐神&#xff08; 沐神_论文精讲_Attention is all you need&#xff09; 1、Abstract 主流的序列转录模型&#xff08;给一个序列生成另一个序列&#xff0c;比如机器翻译&#xff0c;给一句英文&#xff0c;生成一句中文&#x…

数据可视化大屏应急管理综合指挥调度系统完整案例详解(PHP-API、Echarts、百度地图)

文章目录项目说明一、项目说明单位信息数据库字段&#xff1a;资源数据库字段项目需求二、项目开发1.项目分析2.引入库3.项目开发&#xff08;1&#xff09;地图容器构建&#xff08;2&#xff09;筛选和返回按钮事件&#xff08;3&#xff09;企业筛选功能&#xff08;4&#…

【java】stream流

文章目录体验stream流stream流的生成方式Stream流的常见中间操作方法Stream流的常见中间操作方法Stream流的常见终结操作方法Stream流的练习Stream流的收集操作体验stream流 package heima.stream流;import java.util.ArrayList;public class P1 {public static void main(Stri…

node.js+uni计算机毕设项目基于微信小程序的肉鸡养殖管理平台LW(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等…

第二十四章 数论——质数(2)(详细讲解质数的筛选原理和证明!!)

第二十四章 数论——质数的筛选一、朴素筛法——埃氏筛法1、问题描述2、算法思路3、代码实现二、线性筛法——欧拉筛1、朴素筛法的弊端2、欧拉筛&#xff08;1&#xff09;算法思路&#xff08;2&#xff09;代码实现一、朴素筛法——埃氏筛法 1、问题描述 2、算法思路 我们从…

【折腾服务器 2】妖板 Intel N5105 + i226 主板安装 群晖、直通 SATA 控制器 教程

Catch UP 前期回顾&#xff0c;我在这台使用 N5105 和 Intel 226V 2.5G 网卡的电脑上安装了 ESXi 7.0 系统。文章在博客里有&#xff0c;可以去翻翻。 Chapter 1 网络环境准备 登录 VMWare ESXi&#xff0c;点击左侧的网络。 点击 虚拟交换机 有一个 vSwitch 0 这个是默认的&a…

抽象类与接口(Java系列6)

目录 前言&#xff1a; 1.抽象类 1.1抽象类的概念及语法 1.2 抽象类的特征 1.3抽象类的特性 2.接口 2.1接口的概念及语法 2.2接口的使用及特性 2.2.1接口的使用 2.2.2接口的特性 2.3实现多个接口 2.4接口的继承 3.抽象类与接口的区别 结束语&#xff1a; 前言&…

分布式理论之分布式选举

写在前面 一个国家需要领导人制定各种国家决策&#xff0c;一个军队也需要最高统领来制定各种军事决策&#xff0c;同理&#xff0c;一个分布式集群也需要一个领导&#xff0c;来协调整个集群的事务&#xff0c;比如保证数据一致性(这也是最重要的&#xff01;)&#xff0c;分…

uni-app学习总结

本文以B站黑马教程的uni-app项目实战视频为载体&#xff0c;总结uni-app相关用法&#xff0c;如有误&#xff0c;请指出~ 一、创建项目&#xff1a; HbuilderX工具-->文件-->新建-->项目---》选择uni--app项目&#xff0c;创建。 二、项目初始化&#xff1a; 去掉一…

设计模式之结构型模式:适配器模式

前言 前面讲解完了设计模式中的创建性模式&#xff0c;本文开始讲解设计模式中的结构性模式之一&#xff1a;适配器模式。 一、适配器模式的是干什么的&#xff1f; A类想要使用B类中的某些方法&#xff0c;但是不能直接使用&#xff0c;需要一个中间类对B类进行处理后&…

C++的类型转换

目录C语言中的类型转换为什么C需要四种类型转换C强制类型转换static_castreinterpret_castconst_castdynamic_castC语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值类型与接收返回值类型不…

【Linux】第七部分 Linux中系统管理

【Linux】第七部分 Linux中系统管理 文章目录【Linux】第七部分 Linux中系统管理7. Linux中系统管理7.1 进程和服务7.2 service 服务管理systemctl 基本语法systemctl设置后台服务的自启动配置关机重启命令总结7. Linux中系统管理 7.1 进程和服务 一个正在执行的程序或命令&a…