当前位置: 首页 > news >正文

spring cloud alibaba 使用示例

spring cloud alibaba example

spring cloud alibaba nacos 配置中心、spring cloud alibaba nacos 服务注册与发现、openfeign 服务调用、spring cloud loadbalancer 负载均衡、spring cloud alibaba sentinel 限流降级、spring cloud alibaba seata 分布式事务、spring cloud gateway 服务网关、dubbo rpc 调用等。


—— 2025 年 1 月 20 日 甲辰年腊月二十一 大寒

版本

  • jdk:17
  • spring boot:3.3.6
  • spring cloud:4.1.2
  • spring cloud alibaba:2023.0.1.2
  • apache dubbo:3.3.1
  • zookeeper:3.9.3

  注:spring cloud 相关依赖(如 spring cloud alibaba、spring boot 等)版本,存在严格对照关系,故在使用时一定要在组件对应官网查看对应版本!!!

  注: 关于分布式、微服务、spring cloud、spring cloud alibaba 等概念或技术的详情介绍,请移步 分布式微服务系统简述。

目录

    • spring cloud alibaba example
      • 1 nacos 配置中心及服务注册与发现
        • 1.1 nacos 安装
        • 1.2 服务提供者与消费者
        • 1.3 配置中心
        • 1.4 服务注册与发现
      • 2 openfeign 服务调用
        • 2.1 使用示例
        • 2.2 @FeignClient 属性
        • 2.3 主要特点
      • 3 loadbalancer 负载均衡
        • 3.1 使用示例
        • 3.2 负载均衡策略
        • 3.3 自定义策略
      • 4 sentinel 限流降级熔断
        • 4.1 nacos 配置限流熔断规则
        • 4.2 限流触发后进行熔断
        • 4.3 使用 spring cloud sentinel 提供的可视化控制面板配置限流熔断规则
      • 5 seata 分布式事务
      • 6 gateway 服务网关
        • 6.1 初始化
        • 6.2 nacos 中配置路由规则
      • 7 dubbo rpc 调用
        • 7.1 dubbo rpc demo
        • 7.2 nacos 注册中心
        • 7.3 zookeeper 注册中心

1 nacos 配置中心及服务注册与发现

1.1 nacos 安装

  nacos 作为配置中心和服务注册发现中心时,需要安装 nacos 服务端,此时服务提供者和消费者都是 nacos 服务端对应的客户端。nacos 安装请参考 nacos 官网安装手册。

  安装成功之后,进入 bin 目录执行命令(Linux/Unix/Mac:sh startup.sh -m standalone,Windows:startup.cmd -m standalone。其中 standalone 表示单机启动)启动 nacos。

  启动成功之后访问 http://127.0.0.1:8848/nacos 即可打开 nacos 可视化操作界面。初始用户名密码皆为 nacos,至于怎么改,那么我忘了。

1.2 服务提供者与消费者

  首先创建两个 spring boot 应用 provider 和 consumer,分别作为服务提供者和消费者。

  1. 服务提供者 provider:

    1. 除却 spring boot web 应用常用依赖外,添加以下依赖:

      <!-- 解析 bootstrap.yml 文件 -->
      <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId><version>4.1.2</version>
      </dependency><!-- nacos 配置中心 -->
      <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2023.0.1.2</version>
      </dependency><!-- nacos 服务注册和发现 -->
      <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2023.0.1.2</version>
      </dependency>
      
    2. 引导类:

      @EnableDiscoveryClient   // 当该服务作为服务提供者时需要添加(换言之 若 nacos 只用来作为配置中心时 则不需要该注解)
      @SpringBootApplication
      public class ProviderApplication {public static void main(String[] args) {SpringApplication.run(ProviderApplication.class, args);}
      }
      
    3. 提供 restful 接口:

      @RestController
      @RequestMapping("/user")
      public class UserController {@PostMapping("/getUser")public APIResponse<User> getUser(@RequestParam("username") String username) {return APIResponse.success(User.builder().username(username).nickname("影流之主").build());}
      }
      
    4. bootstrap.yml 文件:

      ################### spring cloud 配置 ###################
      spring:application:name: providerprofiles:active: devcloud:nacos:server-addr: localhost:8848username: nacospassword: nacosconfig:namespace: 29e2a54b-b773-46e4-b0bf-5bc1cab94875   # 该值为服务提供者在 nacos 中的配置文件所在的命名空间的 IDgroup: DEFAULT_GROUPfile-extension: yml   # 配置文件后缀discovery:namespace: ${spring.cloud.nacos.config.namespace}
      
  2. 服务消费者 consumer:

    1. 除却 spring boot web 应用常用依赖外,添加以下依赖:

      <!-- 解析 bootstrap.yml 文件 -->
      <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId><version>4.1.2</version>
      </dependency><!-- nacos 配置中心 -->
      <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2023.0.1.2</version>
      </dependency><!-- nacos 服务注册和发现 -->
      <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2023.0.1.2</version>
      </dependency><!-- openfeign 服务调用 -->
      <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>4.1.2</version>
      </dependency><!-- loadbalancer 负载均衡 -->
      <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId><version>4.1.2</version>
      </dependency>
      
    2. 引导类:

      // @EnableFeignClients 该注解的作用是解析 openfeign 客户端时指定的包(org.xgllhz.consumer.feign)
      @EnableFeignClients(basePackages = "org.xgllhz.consumer.feign")   
      @SpringBootApplication
      public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}
      }
      
    3. 在 org.xgllhz.consumer.feign 目录下创建 openfeign 接口:

      // name 值为服务提供者的 spring.application.name 的值
      // path 值为服务提供者的 server.servlet.context-path 的值(path 可以不配置)
      @FeignClient(name = "provider", path = "/provider")
      public interface ProviderFeign {@PostMapping("/user/getUser")   // 当 path 不配置时 此处的 mapping 应为 /provider/user/getUserAPIResponse<User> getUser(@RequestParam("username") String username);
      }
      
    4. 测试:

      @RestController
      @RequiredArgsConstructor
      @RequestMapping("/test")
      public class TestController {private final ProviderFeign providerFeign;@GetMapping("/test")public APIResponse<List<Object>> test() {List<Object> list = new ArrayList<>();APIResponse<User> response = this.providerFeign.getUser("momo");if (response != null && response.getCode() == 1 && response.getData() != null) {list.add(response.getData());}return APIResponse.success(list);}
      }
      
    5. bootstrap.yml:

      ################### spring cloud 配置 ###################
      spring:application:name: consumerprofiles:active: devcloud:nacos:server-addr: localhost:8848username: nacospassword: nacosconfig:namespace: 29e2a54b-b773-46e4-b0bf-5bc1cab94875group: DEFAULT_GROUPfile-extension: ymldiscovery:namespace: ${spring.cloud.nacos.config.namespace}
      
1.3 配置中心
  1. 在 nacos 命名空间中创建 dev 命名空间。

    namespace

  2. 在 nacos 配置管理目录下为服务提供者 provider 和消费者 consumer 创建配置文件。

    config-dev-yaml

  3. 服务提供者 provider 配置文件 provider-dev.yml 内容如下:

    ################### tomcat 配置 ###################
    server:port: 9641servlet:context-path: /providertomcat:uri-encoding: UTF-8netty:connection-timeout: 5000################### spring 配置 ###################
    spring:main:allow-bean-definition-overriding: truecloud:loadbalancer:nacos:enabled: true   # nacos & loadbalancer 同时使用时 开启后负载均衡才生效
    
  4. 服务消费者 consumer 配置文件 consumer-dev.yml 内容如下:

    ################### tomcat 配置 ###################
    server:port: 9642servlet:context-path: /consumertomcat:uri-encoding: UTF-8netty:connection-timeout: 5000################### spring 配置 ###################
    spring:main:allow-bean-definition-overriding: truecloud:loadbalancer:nacos:enabled: true   # nacos & loadbalancer 同时使用时 开启后负载均衡才生效
    
  • 为什么要引入 spring-cloud-starter-bootstrap 依赖?

    spring cloud 最开始使用 bootstrap 来配置 spring cloud,但后来从 2020 版本开始降低了 bootstrap 的优先级,故需要通过引入 spring-cloud-starter-bootstrap 依赖来解析 bootstrap.yml 以提高 bootstrap 的优先级。

  • 为什么不用 nacos 官网推荐的配置方式?

    spring cloud alibaba 从 2023.0.1.3 版本开始,调整了 spring cloud 的配置方式,推荐使用 spring.config.import 的方式从 nacos 加载配置,但其存在 bug。所以我们选用 2023.0.1.2 版本,改版本依旧使用 bootstrap 来加载 nacos 配置。

  • 配置如何加载?

    默认情况下,服务会通过 s p r i n g . a p p l i c a t i o n . n a m e − {spring.application.name}- spring.application.name{spring.profiles.active}.${spring.cloud.nacos.config.file-extension} 为文件名,从 spring.cloud.nacos.config.namespace 对应的命名空间下加载对应配置文件。如服务消费者 consuer 的配文件名为 consumer-dev.yml,命名空间 ID 29e2a54b-b773-46e4-b0bf-5bc1cab94875 对应 dev 命名空间。

  • 配置动态更新:

    • @RefreshScope:该注解是 spring cloud config 提供的,直接作用在要注入属性(如通过 @Value 注入)的类上,当 nacos 中对应的配置发生变更时,该类对应 bean 会被重新初始化。
    • ConfigListener:实现该接口,由 nacos 提供,可作为配置监听器,当 nacos 配置发生变更时可通过自定义逻辑来刷新配置。
    • @NacosConfigurationProperties:由 nacos 提供,用来标记配置类。当 nacos 配置发生变更时,@RefreshScope 和 @ConfigurationProperties 注解会处理更新事件并重新初始化被 @NacosConfigurationProperties 注解标识的配置 bean。
    • @NacosValue:由 nacos 提供,可直接作用在 bean 的属性上。当 nacos 配置发生变更时,属性值会自动更新。
1.4 服务注册与发现

  若某个服务需要作为服务提供者对外提供服务,则只需要引入 spring-cloud-starter-alibaba-nacos-discovery 依赖,并在引导类上使用 @EnableDiscoveryClient(该注解由 spring cloud 提供) 注解将其标记服务提供者即可。其对外提供的服务名为 spring.application.name。此时服务消费者则可以使用 feign、openfeign 或其它方式进行调用。

2 openfeign 服务调用

2.1 使用示例

  通过下面这段代码,就可以在服务消费端以极简单的方式调用服务提供者提供的接口。其中 @FeignClient 指定调用哪个服务提供者,每一个方法对应服务提供者的一个接口。这些功能有 openfeign 组件完成,其本质上是通过 http 调用,只不过 openfeign 封装了调用逻辑,使得调用方式更加简洁。

// name 值为服务提供者的 spring.application.name 的值
// path 值为服务提供者的 server.servlet.context-path 的值(path 可以不配置)
@FeignClient(name = "provider", path = "/provider")
public interface ProviderFeign {@PostMapping("/user/getUser")   // 当 path 不配置时 此处的 mapping 应为 /provider/user/getUserAPIResponse<User> getUser(@RequestParam("username") String username);
}
2.2 @FeignClient 属性
  • name:同 value,指定服务提供者的名称,若使用了注册中心,则会根据该名称从注册中心查找对应的服务,即 spring.application.name 的值。
  • value:同 name。
  • contextId:指定当前 bean 的名称。当消费端为同一个服务定义了两个 FeignClient 时,则需要指定该值。
  • qualifiers:指定当前 bean 的 @Qualifer 的值。
  • url:绝对的 url 或可解析的主机名,当该值不为空时,feign 会直接把请求发到该 url 对应的地址,不会再去注册中心查找服务。
  • decode404:是否解码 404 错误,默认为 false。即当请求出现 404 错误时,feign 是否要对该错误解码。为 true 时表示解码,此时 404 错误不会被直接抛给消费端。
  • configuration:自定义配置类,用来配置 @FeignClient 的行为。可以自定义配置 Decoder、Encoder、Contract、负载均衡策略等,会覆盖默认的配置。
  • fallback:容错回调类,必须实现一个被 @FeignClient 标记且有效的接口,且必须是一个有效的 bean(即要被 @Component 等 bean 标识注解标注等)。如 ProviderFeign 为 feignclient,fallback = ProviderBack.class,则 ProviderBack 类必须实现 ProviderFeign 接口。当 ProviderFeign 中某个接口(如方法 a)调用异常(如超时、不可用或服务内部异常等)时,feign 会回调该接口(方法 a)在回调类中的实现来处理该异常,而不是直接将异常抛给调用者,以此来提高服务的可用性。
  • fallbackFactory:容错回调类工厂,用来创建容错回调类。必须实现一个被 @FeignClient 标记且有效的接口,且必须是一个有效的 bean(即要被 @Component 等 bean 标识注解标注等)。和 fallback 的区别是 factory 实现的方法返回的是 fallback 指定的类类型。
  • path:当前 feign client 内所有方法的路径的前缀。如 path = ‘/api’,某个方法的 @PostMapping(“/test”),则实际请求路径为 ‘/api/test’。若该 feign client 内的方法所属通过一个服务提供者,则 path 可为该服务提供者的 server.servlet.context-path 的值。
  • primary:是否标记该 feign client 对应的 bean 为主 bean,默认为 true。在一些需要区分 bean 优先级的情况下会用到该属性。

  注:openfeign 根据 @FeignClient 注解属性用来根据服务名查找服务提供者的优先级为 contextId > value > name。

2.3 主要特点

  openfeign 作为 spring cloud 官网认证服务调用方式,其主要特点如下:

  • 声明式 API:其封装了 http 调用,如请求方法、请求路径、请求头和请求参数等,且通过注解方式声明 API 接口,使服务调用更加简洁。
  • 负载均衡:与 loadbalancer 负载均衡器无缝搭配,只需要引入 spring-cloud-stater-loadbalancer 依赖即可。
  • 限流降级:与 sentinel 限流降级无缝搭配,只需要引入 spring-cloud-starter-alibaba-sentinel 并开启 sentinel 对 openfeign 的支持,然后配置相关规则即可。
  • 支持多种编码器:支持如 json、xml、form 等多种编码器,可根据需要选择合适编码器。

3 loadbalancer 负载均衡

3.1 使用示例

  spring cloud loadbalancer 与 nacos 一起使用时,只需开启负载均衡即可:

spring:cloud:loadbalancer:nacos:enabled: true   # nacos & loadbalancer 同时使用时 开启后负载均衡才生效

  openfeign 可以与 loadbalancer 无缝搭配使用,只需要引入 spring cloud loadbalancer 依赖即可,切默认使用轮询策略。

  当使用了 nacos 注册中心时,openfeign 发送请求时会从注册中心获取服务实例,这里也使用到了负载均衡,当然 nacos 也支持 loadbalancer,通过上述配置即可。

3.2 负载均衡策略

  spring cloud loadbalancer 内置了两种策略,即轮询和随机选择,且支持自定义策略,默认使用轮询策略。

  • 轮询:将请求按顺序依次分发给对应服务的每个实例。该策略适用于请求处理时间相近的场景。
  • 随机选择:将请求随机分发给一个实例。

  除以上实现外,常用的负载均衡策略还有加权轮询、最少选择、IP 哈希等。

3.3 自定义策略

  若使用 openfeign 服务调用,则可以自定义实现负载均衡策略,然后通过 @FeignClient 的 configuration 属性指定。若使用其它方式调用,则可使用 @LoadBalancerClient 注解指定。

4 sentinel 限流降级熔断

  限流降级需要配置规则,如允许某个接口多少时间内被访问多少次等等,可以将这些规则配置在 nacos 配置中心上,也可以使用 spring cloud alibaba sentinel 提供的可视化操作界面。

<!-- spring cloud alibaba sentinel 依赖 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId><version>2023.0.1.2</version>
</dependency><!-- sentinel 数据(如限流规则、熔断规则等)若要持久化 则需要加入此依赖 -->
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId><version>1.8.8</version>   <!-- 版本需与 spring-cloud-starter-alibaba-sentinel 中 sentinel 的版本保持一致 -->
</dependency>
4.1 nacos 配置限流熔断规则

  使用 spring cloud alibaba snacos 与 sentinel 进行限流降级时,其配置如下(假设对服务提供者 provider 的 /user/getUser 接口作限流操作):

spring:sentinel:log:dir: /Users/xgllhz/Documents/project/github/tmp/sentinel-logdatasource:flow: # 数据源名称 无业务含义 此处意为 流控规则nacos: # 使用 nacos 配置 sentinelserver-addr: ${spring.cloud.nacos.server-addr}username: ${spring.cloud.nacos.username}password: ${spring.cloud.nacos.password}namespace: ${spring.cloud.nacos.config.namespace}group-id: ${spring.cloud.nacos.config.group}data-id: ${spring.application.name}-sentinel-flowdata-type: jsonrule-type: flow   # flow 表示限流# 开启 sentinel 对 feign 的支持(当使用 sentinel 对 feign 调用的接口进行降级时 则需要开启)
feign:sentinel:enabled: true

  在 nacos 上创建 provider-sentinel-flow 文件并添加以下规则:

[{"resource": "/user/getUser","limitApp": "default","grade": 1,"count": 5,   // 表示一秒内并发 5 个(规则的具体配置可查看 sentinel 官网)"clusterMode": false,"controlBehavior": 0,"strategy": 0,"warmUpPeriodSec": 10,"maxQueueingTimeMs": 500,"refResource": "rrr"}
]

  在服务提供者 provider 的 /user/getUser 的接口上加上注解 @SentinelResource(value = “/user/getUser”),此时,在消费端使用 openfeign 调用 /user/getUser 接口时若并发超过 5 个,则会被抛弃。

@RestController
@RequestMapping("/user")
public class UserController {@SentinelResource(value = "/user/getUser")@PostMapping("/getUser")public APIResponse<User> getUser(@RequestParam("username") String username) {return APIResponse.success(User.builder().username(username).nickname("影流之主").build());}
}
4.2 限流触发后进行熔断
  1. 对服务提供者的接口配置限流规则,超出规则限制的请求会抛出 BlockException 异常(可以在提供者端通过配置 blockHandler 属性来捕获 BlockException 并抛出自定义异常)。总之,提供者端的接口会有以下几种非正常情况:

    1. 超出规则 抛出 BlockException 异常
    2. 超出规则 通过配置 blockHandler 来捕获 BlockException 异常然后抛出自定义异常
    3. 接口本身发生异常
    4. 捕获接口本身的异常然后抛出自定义异常
  2. @SentinelResource:当限流规则触发后,可通过 blockHandler 来处理超出并发的请求。如提示 “操作频繁,请稍后再试!” 等。

    @FeignClient(name = "provider", path = "/provider", fallback = ProviderFallback.class)
    public interface ProviderFeign {@PostMapping("/user/getUser")APIResponse<User> getUser(@RequestParam("username") String username);
    }@Component
    public class ProviderFallback implements ProviderFeign {// 当服务提供者的 /user/getUser 接口的限流规则触发后会抛出 BlockException// 消费者端捕获到这个异常后会回调该方法 返回给前端友好提示 如 “操作频繁,请稍后再试!” 而不是直接配错@Override   public APIResponse<User> getUser(String username) {throw GlobalException.error("操作频繁,请稍后再试!");}
    }
    
  3. 对于与客户端直接交互的接口,则可以通过 @SentinelResource 的 blockHandler 和 fallback 属性进行熔断。

    @RestController
    @RequiredArgsConstructor
    @RequestMapping("/test")
    public class TestController {private final ProviderFeign providerFeign;@SentinelResource(value = "/test/test", blockHandler = "blockHandler", fallback = "fallback")@GetMapping("/test")public APIResponse<List<Object>> test() {List<Object> list = new ArrayList<>();APIResponse<User> response = this.providerFeign.getUser("momo");if (response != null && response.getCode() == 1 && response.getData() != null) {list.add(response.getData());}return APIResponse.success(list);}public APIResponse<List<User>> blockHandler(BlockException e) {throw GlobalException.error("操作频繁,请稍后再试!");}public APIResponse<List<User>> fallback() {throw GlobalException.error();}
    }
    
4.3 使用 spring cloud sentinel 提供的可视化控制面板配置限流熔断规则
  1. 下载并启动 sentinel 控制台:

    1. 从 github-sentinel-release 下载 sentinel 控制台 jar 包。

    2. 使用以下命令启动 jar 包(当然你用其它命令也可以 总之它只是个 jar 包而已)

      nohup java -Dserver.port=8081 -Dcsp.sentinel.dashboard.server=localhost:8081 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.8.jar &
      
  2. 在 provider-dev.yml 中绑定服务与 sentinel 控制台:

    spring:sentinel:   # 限流熔断降级配置transport:port: 8719   # 显式指定 以免忘了(控制台与应用数据传输端口 控制台启动后会绑定一个 http server 到该端口)dashboard: localhost:8081   # 控制台对外暴漏的端口(即控制台 web 端访问端口)
    
  3. 使用 @SentinelResource 标识要限流降级的接口, 如:

    @SentinelResource(value = "/user/getUser")   // value 为接口路径
    
  4. 浏览器 http://localhost:8081/#/dashboard 登录 sentinel 控制台配置限流、熔断规则等。默认用户名密码皆为 sentinel。

5 seata 分布式事务

  算了,各位还是自己看官网吧,戳我,我是 seata 官网。

6 gateway 服务网关

6.1 初始化
  1. 创建 spring boot 应用,并引入 spring cloud gateway 相关依赖:

    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId><version>4.1.2</version>
    </dependency>
    

    注:spring cloud gateway 基于 webflux + netty + reactor 实现,又因为 spring 中 web 与 webflux 两种模式是相斥的,故需要排除 spring-boot-starter-web 依赖。

  2. 引导类添加 @EnableDiscoveryClient 注解,以便与 nacos 配合使用。

  3. 创建 bootstrap.xml 配置文件:

    ################### spring cloud 配置 ###################
    spring:application:name: gatewayprofiles:active: devcloud:nacos:server-addr: localhost:8848username: nacospassword: nacosconfig:namespace: 29e2a54b-b773-46e4-b0bf-5bc1cab94875group: DEFAULT_GROUPfile-extension: ymldiscovery:namespace: ${spring.cloud.nacos.config.namespace}
    
6.2 nacos 中配置路由规则

  在nacos 中创建 gateway-dev.yml 文件,并添加路由规则。

################### tomcat 配置 ###################
server:port: 9644   # netty 将在该端口上启动netty:connection-timeout: 5000################### spring 配置 ###################
spring:main:allow-bean-definition-overriding: truecloud:loadbalancer:nacos:enabled: true   # nacos & loadbalancer 同时使用时 开启后负载均衡才生效sentinel:   # 限流熔断降级配置log:dir: /Users/xgllhz/Documents/project/github/tmp/sentinel-logtransport:port: 8719   # 显式指定 以免忘了(控制台与应用数据传输端口 控制台启动后会绑定一个 http server 到该端口)dashboard: localhost:8081   # 控制台对外暴漏的端口(即控制台 web 端访问端口)gateway:routes:- id: consumer   # 对 consumer 服务配置路由规则uri: lb://consumer   # 这么配置是因为 spring cloud gateway 支持此配置方式 且需要引入 sc-loadbalancer 依赖predicates:- Path=/consumer/**   # 当请求路径为 '/consumer' 开头时,将请求以负载均衡的方式转发到 uri(lb://consumer)指定的服务- id: provider   # 对 provider 服务配置路由规则uri: lb://providerpredicates:- Path=/provider/**   # 当请求路径为 '/provider' 开头时,将请求以负载均衡的方式转发到 uri(lb://provider)指定的服务# 开启 sentinel 对 feign 的支持
feign:sentinel:enabled: truelogging:level:org.springframework.cloud.gateway: DEBUG

  注:此处只是简单示例,spring cloud gateway 的更多配置,请移步 spring cloud gateway 官网。

7 dubbo rpc 调用

  dubbo 是阿里巴巴实现的高性能 RPC 框架,其完全适配 spring cloud alibaba 生态。现已捐给 apache。众所周知,常用的服务调用协议有 http、rpc 等,又因为 dubbo 是阿里巴巴出品的,其与 spring cloud alibaba 完全适配,所以在此加上了 dubbo 示例。

  注:有关 dubbo 的详情情况,请移步 dubbo 官网。

7.1 dubbo rpc demo
  1. 创建 dubbo-api 项目,此项目的主要作用是为服务提供者和服务消费者约定一组 api 接口,其中服务提供者负责实现 api 的具体业务,服务消费者调用。

    public interface UserService {// 获取用户详情User getUser(User user);
    }
    

      这个项目只包含一组接口,不需要其它依赖,仅此而已。之所以将这批接口独立出来,是因为这些接口可能会有多个第三方实现,最终会以 jar 包的方式给到第三方以及服务消费者(即服务调用方)。

  2. 创建服务提供方服务,实现 dubbo-api 中的接口。

    1. 引入 dubbo-api 依赖和 apache dubbo 依赖。

      <!-- dubbo-api 依赖-->
      <dependency><groupId>org.xgllhz</groupId><artifactId>dubbo-api</artifactId><version>0.0.1</version>
      </dependency><!-- apache dubbo 依赖 -->
      <dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.3.1</version>
      </dependency>
      
    2. 使用 @EnableDubbo 注解标记引导类,启用 dubbo 协议。

    3. 实现 dubbo-api 接口。

      @DubboService   // 该注解的作用是将该实现类标记为 dubbo 服务 使其可被调用
      public class UserServiceImpl implements UserService {@Overridepublic User getUser(User user) {user.setNickname("潮汐海灵");return user;}
      }
      
  3. 创建服务消费者服务,调用 dubbo-api。

    1. 引入 dubbo-api 依赖 和 apache dubbo 依赖。

      <!-- dubbo-api 依赖-->
      <dependency><groupId>org.xgllhz</groupId><artifactId>dubbo-api</artifactId><version>0.0.1</version>
      </dependency><!-- apache dubbo 依赖 -->
      <dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.3.1</version>
      </dependency>
      
    2. 使用 @EnableDubbo 注解标记引导类,启用 dubbo 协议。

    3. 调用 dubbo-api 接口。

      // 在需要调用的类中使用 @DubboReference 注入 dubbo-api 中的接口即可
      @DubboReference
      private UserService userService;@Override
      public User test(User user) {return this.userService.getUser(user);   // 调用 dubbo-api 中的方法
      }
      

  实际上到此时,还不能调用,因为 dubbo 服务需要一个注册中心来注册和发现服务,此处以 nacos 和 zookeeper 为例,请看下文。

7.2 nacos 注册中心
  1. 在 dubbo 服务提供者和消费者中引入 spring cloud alibaba nacos 的服务注册和发现依赖,若需要还可以引入 nacos 配置和其它依赖。

    <!-- nacos 服务注册和发现 -->
    <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2023.0.1.2</version>
    </dependency>
    
  2. 在配置文件中添加以下配置(此处我们以使用 nacos 配置中心配置为例,所以额外需要 nacos 相关配置)。

    ################### dubbo 配置 ###################
    dubbo:application:name: ${spring.application.name}   # 注册到注册中的服务名qos-port: 9636registry:address: nacos://localhost:8848   # nacos 注册中心地址 其中 'nacos' 表示注册中心使用 nacos zookeeper://localhost:2181(若为 zookeeper 则注掉下方 username、password 和 parameters 配置)username: ${spring.cloud.nacos.username}password: ${spring.cloud.nacos.password}parameters:   # 额外的配置使用 'parameters' 进行配置 如 namespace、group 等namespace: ${spring.cloud.nacos.config.namespace}group: ${spring.cloud.nacos.config.group}protocol:name: dubbo   # dubbo 支持多种协议(dubbo、rmi、hessian、http、webservice、thrift、rest) 此处使用 dubbo 协议port: 9637   # 指定 dubbo 端口
    
  3. 使用 @EnableDiscoveryClient 注解标记服务提供者和消费者的引导类,然后启动服务,就可以调用啦!

7.3 zookeeper 注册中心
  1. 在 dubbo 服务提供者和消费者中引入 zookeeper 的相关依赖。

    <!-- 截至 2024-11-22 zookeeper 稳定版本为 3.8.x 但 curator 并未提供该版本的依赖 故选择 5.7.1 版本(此版本中 zookeeper 为 3.9.2 版本) -->
    <dependency><groupId>org.apache.curator</groupId><artifactId>curator-x-discovery</artifactId><version>5.7.1</version>
    </dependency>
    
  2. 在配置文件中加入以下配置。

    ################### dubbo 配置 ###################
    dubbo:application:name: ${spring.application.name}qos-port: 9636registry:address: zookeeper://localhost:2181  # zookeeper 地址protocol:name: dubbo   # dubbo 支持多种协议(dubbo、rmi、hessian、http、webservice、thrift、rest) 此处使用 dubbo 协议port: 9637   # 指定 dubbo 端口
    
  3. 成了!

  总之吧,就是这篇写的挺乱的不知道为啥。害,就这样吧,先过年!

相关文章:

spring cloud alibaba 使用示例

spring cloud alibaba example spring cloud alibaba nacos 配置中心、spring cloud alibaba nacos 服务注册与发现、openfeign 服务调用、spring cloud loadbalancer 负载均衡、spring cloud alibaba sentinel 限流降级、spring cloud alibaba seata 分布式事务、spring clou…...

Python数据分析-Python语法基础,IPython和Jupyter-Notebooks(二)

title: ‘Python数据分析:Python语法基础&#xff0c;IPython和Jupyter Notebooks&#xff08;二&#xff09;’ tags: python数据分析 categories:python数据分析 keywords:python数据分析 cover: …/img/404_icecream_whale.png description: 本文介绍python的基础语法和jup…...

领域驱动设计(DDD)Spring Boot 3 实现 二

使用 Spring Boot 3 实现领域驱动设计&#xff08;DDD&#xff09;是一种很自然的选择&#xff0c;因为 Spring 提供了良好的生态支持&#xff0c;特别是在分层架构、依赖管理、事件驱动等方面。以下是如何在 Spring Boot 3 中结合 DDD 进行开发的详细指南&#xff1a; 项目结构…...

Vue.js 高级组件开发

Vue.js 高级组件开发&#xff1a;构建一个智能动态表单生成器 ——从可复用架构到性能优化的全链路实践 引言&#xff1a;为什么需要高级组件&#xff1f; 在现代前端开发中&#xff0c;组件不仅是UI的封装&#xff0c;更是业务逻辑的载体。一个“高级”Vue组件应当具备&…...

wangEditor富文本编辑器,Laravel上传图片配置和使用

文章目录 前言步骤1. 构造好前端模版2. 搭建后端存储3. 调试 前言 由于最近写项目需要使用富文本编辑器&#xff0c;使用的是VUE3.0版本所以很多不兼容&#xff0c;实际测试以后推荐使用wangEditor 步骤 构造好前端模版搭建后端存储调试 1. 构造好前端模版 安装模版 模版安…...

Hive之加载csv格式数据到hive

场景&#xff1a; 今天接了一个需求&#xff0c;将测试环境的hive数据导入到正式环境中。但是不需要整个流程的迁移&#xff0c;只需要迁移ads表 解决方案&#xff1a; 拿到这个需求首先想到两个方案&#xff1a; 1、将数据通过insert into语句导出&#xff0c;然后运行脚本 …...

0164__【GNU】gcc -O编译选项 -Og -O0 -O1 -O2 -O3 -Os

【GNU】gcc -O编译选项 -Og -O0 -O1 -O2 -O3 -Os_gcc -o0-CSDN博客...

《DiffIR:用于图像修复的高效扩散模型》学习笔记

paper&#xff1a;2303.09472 GitHub&#xff1a;GitHub - Zj-BinXia/DiffIR: This project is the official implementation of Diffir: Efficient diffusion model for image restoration, ICCV2023 目录 摘要 1、介绍 2、相关工作 2.1 图像恢复&#xff08;Image Rest…...

[Datawheel]利用Zigent框架编写智能体-2

书接上回 1. Zigent实现教程编写智能体 本节将通过 Zigent 框架实现一个教程编写智能体&#xff0c;其主要功能是输入教程主题&#xff0c;然后自动生成完整的教程内容。 设计思路&#xff1a; 先通过 LLM 大模型生成教程的目录&#xff0c;再对目录按照二级标题进行分块&…...

cursor重构谷粒商城05——docker容器化技术快速入门【番外篇】

前言&#xff1a;这个系列将使用最前沿的cursor作为辅助编程工具&#xff0c;来快速开发一些基础的编程项目。目的是为了在真实项目中&#xff0c;帮助初级程序员快速进阶&#xff0c;以最快的速度&#xff0c;效率&#xff0c;快速进阶到中高阶程序员。 本项目将基于谷粒商城…...

Django项目的创建及运行——Django学习日志(一)

1.命令行创建 &#xff08;1&#xff09;创建项目 django-admin startproject HelloWorld&#xff08;这里的名称任意&#xff09; &#xff08;2&#xff09;创建应用&#xff08;app&#xff09; 首先要进入到项目目录&#xff0c;比如我这里的项目目录为HelloWorld cd …...

gesp(C++六级)(1)洛谷:P10250:[GESP样题 六级] 下楼梯

gesp(C六级)&#xff08;1&#xff09;洛谷&#xff1a;P10250&#xff1a;[GESP样题 六级] 下楼梯 题目描述 顽皮的小明发现&#xff0c;下楼梯时每步可以走 1 1 1 个台阶、 2 2 2 个台阶或 3 3 3 个台阶。现在一共有 N N N 个台阶&#xff0c;你能帮小明算算有多少种方案…...

1.23学习

misc buuctf-小明的保险箱 打开附件是一个在线图片首先将其另存为&#xff0c;然后仅仅只是一个图片&#xff0c;而无其他信息&#xff0c;那么我们再进行binwalk或者foremost文件分离&#xff0c;得到了一个文件夹&#xff0c;其中含有一个压缩包但是是一个加密的&#xff0…...

atheris从安装到fuzz输入输出解读

1. 引入 模糊测试是一种自动化的软件测试技术&#xff0c;它通过自动生成大量随机数据作为输入来测试程序&#xff0c;以发现潜在的错误、漏洞或崩溃。atheris是一个专门用于CPython&#xff08;Python的C语言实现&#xff09;的模糊测试框架。 2. 安装atheris 参考1&#x…...

基于自然语言处理的垃圾短信识别系统

基于自然语言处理的垃圾短信识别系统 &#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 目录 设计题目设计目的设计任务描述设计要求输入和输出…...

PAT甲级-1022 Digital Libiary

题目 题目大意 一个图书有图书id&#xff0c;书名&#xff0c;作者&#xff0c;关键字&#xff0c;出版商&#xff0c;出版时间6个信息。现要查询图书的ID&#xff0c;1对应通过书名查询&#xff0c;2对应作者&#xff0c;3对应关键字&#xff08;不需要完全一致&#xff0c;包…...

GD32F470 USB虚拟串口

1. 硬件连接 确保GD32F470开发板的USB接口连接到PC的USB端口。开发板通常提供USB FS&#xff08;全速&#xff09;接口&#xff0c;可以直接使用。 2. 配置USB功能 需要配置USB时钟、GPIO和中断&#xff0c;以支持全速USB设备模式。 2.1 配置USB时钟 c复制 void usb_rcu_…...

25美赛ABCDEF题详细建模过程+可视化图表+参考论文+写作模版+数据预处理

详情见该链接&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 25美国大学生数学建模如何准备&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;-CSDN博客文章浏览阅读791次&#xff0c;点赞13次&#xff0c;收藏7次。通过了解比赛基本…...

【转帖】eclipse-24-09版本后,怎么还原原来版本的搜索功能

【1】原贴地址&#xff1a;eclipse - 怎么还原原来版本的搜索功能_eclipse打开类型搜索类功能失效-CSDN博客 https://blog.csdn.net/sinat_32238399/article/details/145113105 【2】原文如下&#xff1a; 更新eclipse-24-09版本后之后&#xff0c;新的搜索功能&#xff08;CT…...

Elasticsearch 性能测试工具 Loadgen 之 002——命令行及参数详解

上一讲&#xff0c;我们讲解了 Loadgen 的极简部署方式、配置文件、快速使用从 0 到 1 方式。 本讲&#xff0c;我们主要解读一下 Loadgen 的丰富的命令行及参数含义。 有同学可能会说&#xff0c;上面不是介绍很清楚了吗&#xff1f;但&#xff0c;咱们还是有必要详细中文解读…...

DRG/DIP 2.0时代下基于PostgreSQL的成本管理实践与探索(下)

五、数据处理与 ETL 流程编程实现 5.1 数据抽取与转换(ETL) 在 DRG/DIP 2.0 时代的医院成本管理中,数据抽取与转换(ETL)是将医院各个业务系统中的原始数据转化为可供成本管理分析使用的关键环节。这一过程涉及从医院 HIS 系统中抽取患者诊疗数据,并对其进行格式转换、字…...

【设计模式-行为型】状态模式

一、什么是状态模式 什么是状态模式呢&#xff0c;这里我举一个例子来说明&#xff0c;在自动挡汽车中&#xff0c;挡位的切换是根据驾驶条件&#xff08;如车速、油门踏板位置、刹车状态等&#xff09;自动完成的。这种自动切换挡位的过程可以很好地用状态模式来描述。状态模式…...

想品客老师的第六天:函数

函数基础的部分写在这里 函数声明 在js里万物皆对象&#xff0c;函数也可以用对象的方式定义 let func new Function("title", "console.log(title)");func(我是参数title); 也可以对函数赋值&#xff1a; let cms function (title) {console.log(tit…...

hedfs和hive数据迁移后校验脚本

先谈论校验方法&#xff0c;本人腾讯云大数据工程师。 1、hdfs的校验 这个通常就是distcp校验&#xff0c;hdfs通过distcp迁移到另一个集群&#xff0c;怎么校验你的对不对。 有人会说&#xff0c;默认会有校验CRC校验。我们关闭了&#xff0c;为什么关闭&#xff1f;全量迁…...

面向通感一体化的非均匀感知信号设计

文章目录 1 非均匀信号设计的背景分析1.1 基于OFDM波形的感知信号1.2 非均匀信号设计的必要性和可行性1.2 非均匀信号设计的必要性和可行性 3 通感一体化系统中的非均匀信号设计方法3.1 非均匀信号的设计流程&#xff08;1&#xff09;均匀感知信号设计&#xff08;2&#xff0…...

React将props传递给一个组件

React 组件通讯&#xff1a;从单向数据流到跨层级交互的深度实践 ——基于 Props 的通讯机制解析与高阶模式探索 一、Props 的本质&#xff1a;不可变数据管道 React 的 props&#xff08;properties&#xff09;机制构建了单向数据流的核心范式。每个父组件通过 props 向子…...

头歌实训作业 算法设计与分析-贪心算法(第2关:最优装载问题)

任务描述 有一批集装箱要装上一艘载重量为C的轮船&#xff0c;共有n个集装箱&#xff0c;其中集装箱i的重量为Wi。 最优装载问题要求确定在装载体积不受限制的情况下&#xff0c;将尽可能多的集装箱装上轮船。 测试说明 输入和输出说明&#xff1a; 第1行为集装箱数目n和载重限…...

HarmonyOS基于ArkTS卡片服务

卡片服务 前言 Form Kit&#xff08;卡片开发框架&#xff09;提供了一种在桌面、锁屏等系统入口嵌入显示应用信息的开发框架和API&#xff0c;可以将应用内用户关注的重要信息或常用操作抽取到服务卡片&#xff08;以下简称“卡片”&#xff09;上&#xff0c;通过将卡片添加…...

Elasticsearch 性能测试工具 Loadgen 之 001——部署及应用详解

在现代软件开发中&#xff0c;性能测试是确保应用程序稳定性和响应速度的关键环节。 今天&#xff0c;我们就来深入了解一款国产化功能强大的 Elasticsearch 负载测试工具——INFINI Loadgen。 一、INFINI Loadgen 简介 Github地址&#xff1a;https://github.com/infinilabs/l…...

Python算法详解:动态规划

动态规划&#xff08;Dynamic Programming&#xff0c;简称 DP&#xff09;是计算机科学中一种高效解决问题的算法思想。它通过将复杂问题分解为更小的子问题&#xff0c;记录中间结果&#xff0c;避免重复计算&#xff0c;从而提升效率。本文将从动态规划的基础思想出发&#…...

python3+TensorFlow 2.x(二) 回归模型

目录 回归算法 1、线性回归 (Linear Regression) 一元线性回归举例 2、非线性回归 3、回归分类 回归算法 回归算法用于预测连续的数值输出。回归分析的目标是建立一个模型&#xff0c;以便根据输入特征预测目标变量&#xff0c;在使用 TensorFlow 2.x 实现线性回归模型时&…...

lombok 没生效 java: 找不到符号 符号: 方法 setName(java.lang.String)

今天使用lombok 添加了 Data注解 set方法却没起效 解决方法 1 给lombok 添加版本号 再maven刷新下 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.8</version><optional>…...

uiautomator2教程

一、简介 uiautomator2 是一个 Python 库&#xff0c;用于 Android 的 UI 自动化测试&#xff0c;底层基于 Google uiautomator。 二、安装 1、安装adb 2、pip install uiautomator2 3、设备安装 atx - agent&#xff0c;python -m uiautomator2 init 4、安装weditor&…...

旅游风景的代码项目

敦煌莫高窟&#xff1a;用代码打开千年艺术的大门 ——一个零基础也能看懂的神奇项目 前言&#xff1a;当古老艺术遇上现代代码 想象一下&#xff0c;你坐在电脑前&#xff0c;指尖轻轻一点&#xff0c;就能穿越到敦煌莫高窟——看飞天的衣袂飘飘、听千年的驼铃声声。这不是科…...

【后端开发】字节跳动青训营之性能分析工具pprof

性能分析工具pprof 一、测试程序介绍二、pprof工具安装与使用2.1 pprof工具安装2.2 pprof工具使用 资料链接&#xff1a; 项目代码链接实验指南pprof使用指南 一、测试程序介绍 package mainimport ("log""net/http"_ "net/http/pprof" // 自…...

【测试】-- 认识测试

1. 软件测试定义 软件测试就是验证软件产品特性&#xff08;功能、性能、界面、易用性等&#xff09;是否满足用户的需求。 2. 测试的岗位 软件测试开发工程师&#xff08;测开&#xff09; 开发&#xff1a;开发测试效率工具&#xff08;自动化、性能测试、覆盖率等&#x…...

浏览器hid 和蓝牙bluetooth技术区别

HID与蓝牙技术区别 引言 在前端开发中&#xff0c;与外部设备的交互越来越重要&#xff0c;尤其是在移动设备和物联网设备日益普及的今天。HID&#xff08;Human Interface Device&#xff09;和蓝牙&#xff08;Bluetooth&#xff09;是两种常用的技术&#xff0c;用于实现设备…...

PCIE模式配置

对于VU系列FPGA&#xff0c;当DMA/Bridge Subsystem for PCI Express IP配置为Bridge模式时&#xff0c;等同于K7系列中的AXI Memory Mapped To PCI Express IP。...

mysql 学习3 SQL语句--整体概述。SQL通用语法;DDL创建数据库,查看数据库,删除数据库,使用数据库;

SQL通用语法 SQL语句分类 DDL data definition language : 用来创建数据库&#xff0c;创建表&#xff0c;创建表中的字段&#xff0c;创建索引。因此成为 数据定义语言 DML data manipulation language 有了数据库和表以及字段后&#xff0c;那么我们就需要给这个表中 添加数…...

Swing使用MVC模型架构

什么是MVC模式? MVC是一组英文的缩写,其全名是Model-View-Controller,也就是“模型-视图-控制器”这三个部分组成。这三个部分任意一个部分发生变化都会引起另外两个发生变化。三者之间的关系示意图如下所示: MVC分为三个部分,所以在MVC模型中将按照此三部分分成三…...

Java定时任务实现方案(二)——ScheduledExecutorService

这篇笔记&#xff0c;我们要来介绍实现Java定时任务的第二个方案&#xff0c;使用ScheduledExecutorService&#xff0c;以及该方案的优点和缺点。 ScheduledExecutorService是Java并发包java.util.concurrent中用于执行定时任务和周期性任务的接口&#xff0c;它拓展了Executo…...

Agent群舞,在亚马逊云科技搭建数字营销多代理(Multi-Agent)(下篇)

在本系列的上篇中&#xff0c;小李哥为大家介绍了如何在亚马逊云科技上给社交数字营销场景创建AI代理的方案&#xff0c;用于社交动态的生成和对文章进行推广曝光。在本篇中小李哥将继续本系列的介绍&#xff0c;为大家介绍如何创建主代理&#xff0c;将多个子代理挂载到主代理…...

Leecode刷题C语言之收集所有金币可获得的最大积分

执行结果:通过 执行用时和内存消耗如下&#xff1a; int dfs(int node, int parent, int f, int* coins, int k, int **children, int *childCount, int **memo) {if (memo[node][f] ! -1) {return memo[node][f];}int res0 (coins[node] >> f) - k;int res1 coins[no…...

STM32_SD卡的SDIO通信_基础读写

本篇将使用CubeMXKeil, 创建一个SD卡读写的工程。 目录 一、SD卡要点速读 二、SDIO要点速读 三、SD卡座接线原理图 四、CubeMX新建工程 五、CubeMX 生成 SD卡的SDIO通信部分 六、Keil 编辑工程代码 七、实验效果 实现效果&#xff0c;如下图&#xff1a; 一、SD卡 速读…...

新手理解:Android 中 Handler 和 Thread.sleep 的区别及应用场景

新手理解&#xff1a;Android 中 Handler 和 Thread.sleep 的区别及应用场景 Handler 是啥&#xff1f;Handler 的几个核心功能&#xff1a; Thread.sleep 是啥&#xff1f;Thread.sleep 的核心特点&#xff1a; 两者的区别它们的应用场景1. Handler 的应用场景2. Thread.sleep…...

C语言-----扫雷游戏

扫雷游戏的功能说明 &#xff1a; • 使⽤控制台实现经典的扫雷游戏 • 游戏可以通过菜单实现继续玩或者退出游戏 • 扫雷的棋盘是9*9的格⼦ • 默认随机布置10个雷 • 可以排查雷&#xff1a; ◦ 如果位置不是雷&#xff0c;就显⽰周围有⼏个雷 ◦ 如果位置是雷&#xff0c;就…...

监控与调试:性能优化的利器 — ShardingSphere

在分布式数据库系统中&#xff0c;监控和调试是确保系统高效运行的关键。ShardingSphere 提供了多种监控和调试工具&#xff0c;帮助开发者实时跟踪和优化性能&#xff0c;识别瓶颈&#xff0c;进行故障排查&#xff0c;从而提升系统的稳定性和响应速度。本文将介绍如何使用 Sh…...

Kubernetes相关知识入门详解

一、Pod的滚动升级 1.服务升级的一般思路&#xff1a;停止与该服务相关的所有服务pod&#xff0c;重新拉去更新后的镜像并启动。这种方法存在一个比较现实的问题是逐步升级导致较长时间的服务不可用。 2.Kubernetes滚动升级的思路&#xff1a;通过滚动升级的命令创建新的rc&…...

多层 RNN原理以及实现

数学原理 多层 RNN 的核心思想是堆叠多个 RNN 层&#xff0c;每一层的输出作为下一层的输入&#xff0c;从而逐层提取更高层次的抽象特征。 1. 单层 RNN 的数学表示 首先&#xff0c;单层 RNN 的计算过程如下。对于一个时间步 t t t&#xff0c;单层 RNN 的隐藏状态 h t h_t…...

Unity阿里云OpenAPI 获取 Token的C#【记录】

获取Token using UnityEngine; using System; using System.Text; using System.Linq; using Newtonsoft.Json.Linq; using System.Security.Cryptography; using UnityEngine.Networking; using System.Collections.Generic; using System.Globalization; using Cysharp.Thr…...