服务网关 Gateway

news2024/11/19 20:42:38

服务网关 Gateway

  • 服务网关介绍
  • Gateway 介绍
    • Gateway 和 Nginx 网关的区别
    • Gateway 核心概念
    • Gateway工作流程
  • Gateway 案例
  • Predicate(断言)
    • After 路由谓词工厂
    • Before路由谓词工厂
    • Between 路由谓词工厂
    • Cookie路由谓词工厂
    • Header 路由谓词工厂
    • Host 路由谓词工厂
    • Method路由谓词工厂
    • Path 路由谓词工厂
    • Query 路由谓词工厂
    • RemoteAddr 路由谓词工厂
    • Weight路由谓词工厂
    • XForwarded Remote Addr路由谓词工厂
  • Filter(过滤器)
    • 路由过滤器 Gateway Filter
    • 全局过滤器 Global Filters
  • Gateway跨域问题

服务网关介绍

在微服务架构中,一个大的系统被拆分成为了多个小的服务提供出来,每一个服务他们自成体系,每一个服务可以拥有自己的数据库,可以使用不同的技术框架和不同的语言进行开发,每一个服务都有自己的服务地址,服务之间通常以提供 Rest Api 风格的接口来相互调用。

客户端在一次请求中,可能需要调用多个服务接口才能完成一个业务需求,如果让客户端直接与各个微服务进行通信,可能会存在如下问题:

  1. 客户端会多次请求不同的微服务,增加了客户端的复杂性
  2. 存在跨域请求,在一定场景下处理相对复杂
  3. 认证复杂,每个服务都需要独立认证
  4. 难以重构,随着项目的迭代,可能需要重新划分新的微服务,例如可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将会很难实施
  5. 某些微服务可能使用了防火墙、浏览器不友好的协议,直接访问会有一定困难
  6. 安全隐患增加,服务端暴漏的接口增加,增加服务器受攻击的面积

在微服务架构中使用网关就可以解决以上问题。

网关介绍:
API 网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。
API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。
API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。

微服务网关是微服务架构中的一个关键的角色,用来保护、增强和控制对于微服务的访问,微服务网关是一个处于应用程序或服务之前的系统,用来管理授权、访问控制和流量限制等,这样微服务就会被微服务网关保护起来,对所有的调用者透明。因此,隐藏在微服务网关后面的业务系统就可以更加专注于业务本身。

微服务网关主要作用:

  1. 提供了服务的统一访问入口,隔离外网与系统。
  2. 提供统一的安全、路由和流量等公共服务组件。
  3. 提供统一的监控工具、配置管理等基础设施

网关处在微服务架构中的位置如下
在这里插入图片描述

Gateway 介绍

Spring Cloud Gateway 是 Spring官方基于Spring 5.0,Spring Boot 2.0和 Project Reactor 等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway 作为 Spring Cloud生态系中的网关,目标是替代 zuul ,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。

Nignx 是一个高性能的Http和反向代理web服务器,特点是占用内存少,并发能力强,用C语言写的。
作用:

  • 服务器的负载均衡
  • 反向代理服务器
  • 作为web服务器
  • 网关

Gateway 和 Nginx 网关的区别

  1. Nignx是流量网关,GateWay是业务网关
  2. 流量网关相当于访问的一个总入口,前端页面的一个容器。主要的功能有管理日志,流量监控,黑白名单,请求的负载均衡,全局限流等。业务网关是针对具体的后端应用和服务,主要的功能是缓存策略、鉴权策略等
  3. 一般流量网关配置在前,业务网关配置在后
  4. Nginx是C语言写的,GateWay是java语言写的
  5. GateWay主要是路由、断言和过滤器,利用这些可以做流控
  6. Nginx主要是负载均衡,反向代理,以及做web服务器

总结:gateway是前端工程到后台服务器之间的一个对内网关,nginx是用户到前端工程的网关对外网关。Nginx在其中扮演的角色:反向代理,负载均衡。gateway在其中扮演的角色:统一鉴权,监控,路由。

Gateway 核心概念

Route(路由):路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由。
Predicate(断言):参考的是Java8的 java.util.function.Predicate,开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由。
Filter(过滤):指的是Spring框架中Gateway Filter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。
请添加图片描述
一个 web 请求,通过一些匹配条件,定位到真正的服务节点。并在这个转发过程的前后,进行一些精细化控制(过滤器)。

predicate (断言) 就是路由的匹配条件,过滤器 filter,可以理解为一个无所不能的拦截器,可以在执行前后来执行自定义的逻辑,再加上目标 uri,就可以实现一个具体的路由。

Gateway工作流程

请添加图片描述
客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。
Filter 在 “pre” 类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,在 “post” 类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。

Gateway 案例

创建新模块,引入Gateway 核心依赖。Gateway 作为一个独立的服务,也需要注册到注册中心,同时也需要去注册中心获取服务列表,这里使用 nacos 作注册中心。

<!--网关依赖-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos服务发现依赖-->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

在配置文件进行gateway配置

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # nacos地址
    gateway:
      discovery:
        locator:
          #开启默认动态路由规则
          enabled: true

经过上面的配置,gateway已经具备了默认的动态路由规则。

默认动态路由规则格式
http://Gateway网关的域名 : Gateway网关的端口 / 微服务的名称(大写)+ 微服务的服务路径
如
http://localhost:10010/SERVICE-GOODS/goods/findByGid?gid=1 
等价于
http://service-goods/goods/findByGid?gid=1

在配置文件中配置自定义路由

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # nacos地址
    gateway:
      discovery:
        locator:
          #开启默认动态路由规则
          enabled: true
      #自定义路由映射,可以配置多条路由规则,一个路由是由id、uri、predicates、filters组成
      routes:
        - id: user-service # 路由标示,必须唯一,建议为服务名
          uri: lb://userservice # 路由的目标地址
          predicates: # 路由断言,判断请求是否符合规则
            - Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合
         #filters:
        
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**
         #filters:

可以在 routes 下配置多条路由规则,一条路由是由 id,uri,predicates,filters 组成,其中 id 用来唯一标识一个路由,uri 是路由匹配后要访问的地址,predicates(断言)匹配路由的规则,filters 当路由匹配后,使用过滤器可以对请求和响应进行精细化的控制。

其中 uri 可以是固定的服务地址,如 http://localhost:8001。也可以使用 lb://服务名称。gateway会去注册中心获取服务列表,然后访问的时候对服务进行负载均衡。

默认动态路由规则和自定义路由规则可以同时存在,如果要禁用默认动态路由规则,只需要把 gateway.discovery.locator.enabled的值修改为 false即可生效。

代码配置自定义路由规则

@Configuration
public class GatewayConfig {
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder) {
        return routeLocatorBuilder.routes()
                //可以使用通配符,例如:/provider/product/**
                .route("user-service", r -> r.path("/user/**").uri("lb://userservice"))
                .route("order-service", r -> r.path("/order/**").uri("lb://orderservice"))
                .build();
    }
}

Predicate(断言)

断言作用:匹配路由的条件,如果请求与断言相匹配则进行路由,如果不匹配直接 404
路由断言工厂 Route Predicate Factory:在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory 读取并处理,转变为路由判断的条件。

Spring Cloud Gateway 中的断言工厂
请添加图片描述

After 路由谓词工厂

After 路由谓词工厂接受一个参数,一个日期时间(它是一个java ZonedDateTime)。此谓词匹配在指定日期时间之后发生的请求。

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - After=2017-01-20T17:42:47.789-07:00[America/Denver]

Before路由谓词工厂

Before路由谓词工厂接受一个参数,一个日期时间(它是一个java ZonedDateTime)。此谓词匹配在指定日期时间之前发生的请求。

spring:
  cloud:
    gateway:
      routes:
      - id: before_route
        uri: https://example.org
        predicates:
        - Before=2017-01-20T17:42:47.789-07:00[America/Denver]

Between 路由谓词工厂

Between 路由谓词工厂接受两个参数datetime1和datetime2,它们是java ZonedDateTime对象。此谓词匹配在datetime1之后和datetime2之前发生的请求。datetime2参数必须在datetime1之后。

spring:
  cloud:
    gateway:
      routes:
      - id: between_route
        uri: https://example.org
        predicates:
        - Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]

Cookie路由谓词工厂

Cookie路由谓词工厂接受两个参数,Cookie名称和 regexp (一个Java正则表达式)。此谓词匹配具有给定名称且其值与正则表达式匹配的cookie。

spring:
  cloud:
    gateway:
      routes:
      - id: cookie_route
        uri: https://example.org
        predicates:
        - Cookie=chocolate, ch.p

Header 路由谓词工厂

Header 路由谓词工厂接受两个参数:Header和regexp(一个Java正则表达式)。此谓词与具有给定名称且其值与正则表达式匹配的标头匹配。

spring:
  cloud:
    gateway:
      routes:
      - id: header_route
        uri: https://example.org
        predicates:
        - Header=X-Request-Id, \d+

Host 路由谓词工厂

Host 路由谓词工厂接受一组参数,一组匹配的域名列表,多个域名之间使用逗号分隔,该模式是一种 Ant 风格的模式,以 . 分隔符为分隔符。

spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: https://example.org
        predicates:
        - Host=**.somehost.org,**.anotherhost.org

如果请求的主机头值为 www.somehost.org 或 beta.somehost.org 或 www.anotherhost.org,则此路由匹配。

Method路由谓词工厂

Method 路由谓词工厂接受一个方法参数,该参数是一个或多个参数: 请求的方式(POST,GET)。只有指定方式的请求才可以匹配成功。

spring:
  cloud:
    gateway:
      routes:
      - id: method_route
        uri: https://example.org
        predicates:
        - Method=GET,POST

Path 路由谓词工厂

Path 路由谓词工厂接受两个参数: 路径模式列表和一个名为matchTrailingSlash的可选标志(默认为true)。
matchTrailingSlash 属性来为路由添加斜杠(/)作为路径的结尾。matchTrailingSlash属性只影响路由中路径的结尾,而不会影响其他部分的路径。

spring:
  cloud:
    gateway:
      routes:
      - id: path_route
        uri: https://example.org
        predicates:
        - Path=/red/{segment},/blue/{segment}

如果请求路径为/ red/1 或 /red/1/ 或 /red/blue 或 /blue/green,则此路由匹配。如果matchTrailingSlash 设置为false,那么请求路径 /red/1/ 将不匹配。

Query 路由谓词工厂

Query 路由谓词工厂接受两个参数:一个必需的参数和一个可选的regexp(它是一个Java正则表达式)。

spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: https://example.org
        predicates:
        - Query=green

如果请求中包含 green 查询参数,则匹配上述路由。
http://localhost:10010/order-service/order/findAll?green=1

spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: https://example.org
        predicates:
        - Query=red, gree.

如果请求参数中包含red参数,并且red参数必须符合逗号后边的正则表达式的值,匹配成功则匹配上述路由。
http://localhost:10010/order-service/order/findAll?red=green

RemoteAddr 路由谓词工厂

RemoteAddr 路由谓词工厂接受一个源列表(最小大小为1),它们是 CIDR 表示法(IPv4 或 IPv6)字符串,例如192.168.0.1/16(其中192.168.0.1是 IP 地址和16子网掩码)。

spring:
  cloud:
    gateway:
      routes:
      - id: remoteaddr_route
        uri: https://example.org
        predicates:
        - RemoteAddr=192.168.1.1/24

如果请求的远端地址为192.168.1.1 ~ 192.168.1.255,则此路由匹配。

Weight路由谓词工厂

Weight路由谓词工厂接受两个参数:group和Weight (int型)。权重按组计算。

spring:
  cloud:
    gateway:
      routes:
      - id: weight_high
        uri: https://weighthigh.org
        predicates:
        - Weight=group1, 8
      - id: weight_low
        uri: https://weightlow.org
        predicates:
        - Weight=group1, 2

这条路线会将 80% 的流量转发到weighthigh.org,将 20% 的流量转发到weightlow.org。

XForwarded Remote Addr路由谓词工厂

XForwarded Remote Addr路由谓词工厂接受一个源列表(最小大小为1),这些源是 CIDR 表示法(IPv4或IPv6)字符串,例如192.168.0.1/16(其中192.168.0.1是IP地址,16是子网掩码)。
该路由谓词允许基于HTTP头 X-Forwarded-For 过滤请求。
可以与反向代理一起使用,例如负载均衡或web应用程序防火墙,其中只有当请求来自这些反向代理使用的受信任IP地址列表时才允许请求。

spring:
  cloud:
    gateway:
      routes:
      - id: xforwarded_remoteaddr_route
        uri: https://example.org
        predicates:
        - XForwardedRemoteAddr=192.168.1.1/24

如果X-Forwarded-For报头包含192.168.1.1 ~ 192.168.1.255,则此路由匹配。

Filter(过滤器)

Spring Cloud Gateway 根据作用范围划分为 GatewayFilter(路由过滤器) 和 GlobalFilter(全局过滤器)。

路由过滤器允许以某种方式修改传入的HTTP请求或传出的HTTP响应。路由过滤器的作用域是特定的路由。Spring Cloud Gateway包括许多内置的GatewayFilter工厂。

全局过滤器:全局过滤器和路由过滤器区别,就是全局过滤器针对于所有路由进行设置的过滤规则,实际开发当中很少会针对于某一个路由使用Filter,大部分都会采用全局过滤器。

从生命周期划分,可以分为:
Pre型过滤器:用于在请求被转发到业务服务之前进行处理,可以用于执行参数校验、权限校验等操作。
Post型过滤器:用于在收到业务服务的响应之后进行处理,可以用于执行响应内容、响应头的修改等操作。

路由过滤器 Gateway Filter

用于拦截并链式处理Web请求,可以实现横切与应用无关的需求,比如:鉴权、限流、日志输出等。
过滤器允许以某种方式修改传入的HTTP请求或传出的HTTP响应,可以限定作用在某些特定请求路径上。Spring Cloud Gateway包含许多内置的网关过滤器工厂,包括头部过滤器、路径过滤器、Hystrix过滤器和重写请求URL的过滤器,还有参数和状态码等其他类型的过滤器。

内置的路由过滤器
请添加图片描述
常用内置路由过滤器介绍

AddRequestHeader GatewayFilter 工厂接受一个名称和值参数。

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_header_route
        uri: https://example.org
        filters:
        - AddRequestHeader=X-Request-red, blue

将X-Request-red:blue报头添加到所有匹配请求的下游请求报头中。

// 取出报文头中的参数
String header = request.getHeader("X-Request-red");

AddResponseHeader GatewayFilter 工厂接受一个名称和值参数。

spring:
  cloud:
    gateway:
      routes:
      - id: add_response_header_route
        uri: https://example.org
        filters:
        - AddResponseHeader=X-Response-Red, Blue

将X-Response-Red:Blue报头添加到所有匹配请求的下游响应报头中。

// 取出报文头中的参数
String header = response.getHeader("X-Request-red");

AddRequestParameter GatewayFilter 工厂接受一个名称和值参数。

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_parameter_route
        uri: https://example.org
        filters:
        - AddRequestParameter=red, blue

将为所有匹配请求的下游请求的查询字符串添加 red=blue。

Default Filters 对所有路由都生效的过滤器
要添加过滤器并将其应用于所有路由,可以使用spring.cloud.gateway.default-filters。

spring:
  cloud:
    gateway:
      default-filters:
      - AddResponseHeader=X-Response-Default-Red, Default-Blue

在 default-filters 下添加的过滤器,将会对所有路由都生效。

更多的内置路由过滤器,请查看官网。Gateway文档地址

全局过滤器 Global Filters

Gateway全局过滤器(Global Filters)是一种可以对所有进入网关的请求和微服务响应进行处理过滤的机制。它不需要在配置文件中配置,作用在所有的路由上,最终通过GatewayFilterAdapter包装成GatewayFilterChain能够识别的过滤器。
自定义全局过滤器
自定义全局过滤器过滤器需要实现两个接口:GatewayFilter、Ordered(也可以使用 @Order 注解)。

代码示例,验证 authorization 参数来决定是否放行。

// @Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {
	
	// exchange 请求上下文,里面可以获取Request、Response等信息 
	// chain 用来把请求委托给下一个过滤器
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 1.获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> params = request.getQueryParams();
        // 2.获取参数中的 authorization 参数
        String auth = params.getFirst("authorization");
        // 3.判断参数值是否等于 admin
        if ("admin".equals(auth)) {
            // 4.是,放行
            return chain.filter(exchange);
        }
        // 5.否,拦截
        // 5.1.设置状态码
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        // 5.2.拦截请求,当前请求结束
        return exchange.getResponse().setComplete();
    }
    
    @Override
    public int getOrder() {
        return -1;
    }
}

请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter
请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器。

过滤器执行顺序
每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前。
GlobalFilter通过实现Ordered接口,或者添加 @Order注解来指定order值。
路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增。
当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行。

Gateway跨域问题

跨域:在浏览器中,当 JavaScript 需要向一个不同的域名或端口发送AJAX请求时,就会发生跨域请求。

解决方案:CORS,CORS是一个缩写,全称为Cross-Origin Resource Sharing,它是一种用于Web应用程序的安全机制,用于在浏览器和Web服务器之间允许跨域请求。CORS是为了解决Web应用程序中不同源之间的安全问题而提出的。通过使用CORS,Web应用程序可以安全地从一个源向另一个源发送跨域请求,从而避免了安全漏洞和攻击。

CORS 配置

spring:
  cloud:
    gateway:
      globalcors: # 全局的跨域处理
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
        corsConfigurations:          
          '[/**]':
            # 允许跨域的源(网站域名/ip),设置*为全部
            allowedOrigins: # 允许哪些网站的跨域请求
              - "http://localhost:8090"
              - "http://www.leyou.com"
            # 允许跨域的method, 默认为GET和OPTIONS,设置*为全部
            allowedMethods: # 允许的跨域ajax的请求方式
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
			# 允许跨域请求里的head字段,设置*为全部
            allowedHeaders: "*" # 允许在请求中携带的头信息
            allowCredentials: true # 是否允许携带cookie
            # 跨域允许的有效期
            maxAge: 360000 # 这次跨域检测的有效期

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

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

相关文章

支付宝支付(六):小程序支付(Go+Gin+内网穿透)

一、前置条件 &#xff08;1&#xff09;go语言&#xff0c;1.18 &#xff08;2&#xff09;Gin、第三方依赖包&#xff1a;gopay【github.com/go-pay/gopay/alipay】https://github.com/go-pay/gopay/blob/main/doc/wechat_v3.md &#xff08;3&#xff09;支付宝支付相关信…

Java面向对象程序开发——JDK8新特性

文章目录 网络编程入门知识JDK8新特性Lambda表达式以多线程为例&#xff1a;Lambda结合for循环&#xff1a; Stream流获取一个流的2种常用的方式&#xff1a;常用方法终结方法延迟方法 案例 网络编程入门知识 软件结构、协议分类、网络通信协议、网络编程三要素、TCP通信协议、…

爬虫的分布式思维与实现思路

爬虫的分布式思维与实现思路 基本构架 scrapy-redis实现分布式&#xff0c;其实从原理上来说很简单&#xff0c;这里为描述方便&#xff0c;我们把自己的核心服务器称为master&#xff0c;而把用于跑爬虫程序的机器称为slave 我们知道&#xff0c;采用scrapy框架抓取网页&…

netty学习(4):通过SpringBoot Web发送消息实现netty实现多个客户端与服务器通信

1. 基于netty学习&#xff08;3&#xff09;:SpringBoot整合netty实现多个客户端与服务器通信的学习&#xff0c;要想通过http在netty客户端之间发送消息&#xff0c;需要实现spring-boot-starter-web&#xff0c;封装消息格式&#xff0c;自动调用netty客户端 2. 封装一个简单…

算法笔记——哈希表篇

一般哈希表都是用来快速判断一个元素是否出现集合里&#xff0c;哈希表并不意味着一定要使用HashMap&#xff0c;有时候使用数组更方便&#xff0c;有时候要使用set&#xff0c;依据具体情况而定&#xff0c;哈希表是典型的空间换时间。 数组作为哈希表 一些应用场景就是为数组…

工具 | 应用程序无法启动,应为应用程序的并行配置不正确

工具 | 应用程序无法启动&#xff0c;应为应用程序的并行配置不正确 “E:\02-Doc\朱老师物联网大讲堂-全部视频\朱有鹏老师嵌入式linux核心课程\开发版光盘资料\X210V3S_A\tools\x210_Fusing_Tool.exe”的激活上下文生成失败。 找不到从属程序集 Microsoft.VC90.MFC,processorA…

DNS-去中心化域名系统,创建您在DeSoc 社会中的YUAN ID

传统域名系统 (DNS) 是一个分层的分散信息存储&#xff0c;用于将用户在网络浏览器中输入可读名称&#xff08;例如 www.baidu.com&#xff09;解析为IP地址&#xff0c;来访问互联网上的计算机。传统DNS使用一种分布式数据库&#xff0c;有严格的上下级关系&#xff0c;上级仅…

[Android JNI] --- JNIEnv和JavaVM

1 JVMEnv 1.1 JNIEnv 是什么 JNIEnv 即 Java Native Interface Environment&#xff0c;Java 本地编程接口环境。JNIEnv 内部定义了很多函数用于简化我们的 JNI 编程。 JNIEnv是提供JNI Native函数的基础环境&#xff0c;线程相关&#xff0c;不同线程的JNIEnv相互独立&#…

SpringBoot快速回顾(@value读取配置文件)

目录 1.定义配置文件2. 定义Controller类3. 测试4. 优化4.1 封装实体类4.3 定义controller类4.2 测试 本文将介绍如何使用value读取配置文件的内容。 在实际项目中&#xff0c;往往会在配置文件中写项目部署需要配置的环境信息&#xff08;数据库驱动&#xff0c;数据库账号密码…

医疗金融法律大模型:从ChatDoctor到FinBERT/FinGPT/BloombergGPT、ChatLaw/LawGPT_zh

第一部分 各种医疗类ChatGPT&#xff1a;或中英文数据微调LLaMA、或中文数据微调ChatGLM 1.1 基于LLaMA微调的中英文版ChatDoctor 1.1.1 ChatDoctor&#xff1a;通过self-instruct技术提示API的数据和医患对话数据集微调LLaMA Github上有一个基于LLaMA模型的医疗微调模型&am…

zabbix (自定义监控内容-配置邮件报警-自动发现与自动注册)

目录 zabbix 客户端主机配置自定义监控内容设置邮件报警zabbix 自动发现与自动注册zabbix 自动发现&#xff08;对于 agent2 是被动模式&#xff09;//zabbix 自动发现&#xff08;对于 agent2 是被动模式&#xff09;zabbix 自动注册&#xff08;对于 agent2 是主动模式&#…

IDEA+springboot+jpa+Layui+Mysql销售考评系统源码

IDEAspringbootjpaLayuiMysql销售考评系统源码 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.评分结果3.评分管理4.添加评分5.用户管理6.添加用户7.角色管理8.添加角色8.销售管理9.添加销售 三、部分代码UserDao.javaUserController.javaUser.java 四、其他获取源码 一、…

计算机组成原理实验二:多位逻辑门构建

目录 一、实验目的 二、实验设备 三、实验原理 四、实验内容 1. 16位非门 2.16位与门 3.16位或门 4. 16位复用器 五、实验习题 1.还可以怎样设计各种芯片的物理结构 2.“block copy”&#xff08;块复制&#xff09;和edit菜单中“copy to clipboard”的区别 六、自…

在线OJ项目

1.在线OJ-背景介绍 在线的网页版的编程平台.&#xff0c;打开一个网站,上面就能看到很多的算法题.&#xff0c;在线做题,在线提交.立即就能看到运行结果,是否通过. leetcode 牛客等 一个在线OJ平台,核心功能: 能够管理题目(保存很多的题目信息:题干&#xff0b;测试用例)题…

FPGA软核调试方法

软核工程创建步骤 创建如下工程目录 bin目录&#xff1a;存放SDK工程生成的elf文件(Release编译模式) hdf目录&#xff1a;存放fpga工程师提供的的hdf文件 prj目录&#xff1a;工程目录(包含SDK工程源码) doc目录&#xff1a;文档目录 基于2018.2版本SDK建立工程 打开Xil…

Spring Boot中的CSRF攻击及预防

Spring Boot中的CSRF攻击及预防 什么是CSRF攻击&#xff1f; CSRF&#xff08;Cross-site Request Forgery&#xff09;跨站请求伪造&#xff0c;也称为“one-click attack”或“session riding”&#xff0c;是一种网络攻击方式&#xff0c;攻击者通过在受害者浏览器上欺骗或…

【redis】生产级部署

目录 环境部署 redis环境部署 redis多实例配置 构建redis cluster集群 cluster生产集群部署 Cluster集群故障切换 环境部署 1 、关闭防火墙 2 、准备两台虚拟机配置内容如下 redis-master 192.168.108.67 7000 redis-master01 7001 redis-master02 7002 redis-ma…

Vue2.0-3.0 入门到实战 - 初始及插件安装

1 创建view实例,初始化渲染 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><div id"app">{{ msg }} </div><script type&…

第123天:内网安全-域防火墙入站出站规则不出网隧道上线组策略对象同步

#知识点&#xff1a; 0、防火墙组策略对象 1、OSI七层协议模型 2、正反向监听器说明 3、隧道技术分层协议 4、CS&MSF&控制上线-隧道技术&#xff1a;解决不出网协议上线的问题&#xff08;利用出网协议进行封装出网&#xff09; -代理技术&#xff1a;解决网络通讯不通…

arduino平台控制直流电机PID速度闭环控制编程实现

PID&#xff08;Proportional-Integral-Derivative&#xff0c;比例-积分-微分&#xff09;控制是一种常用的控制算法&#xff0c;可以用于实现直流有刷电机的速度闭环控制。PID控制器根据当前的误差&#xff08;期望速度与实际速度之差&#xff09;来计算输出&#xff0c;以调…