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

SpringCloud-Alibaba第二代微服务快速入门

1.简介

Spring Cloud Alibaba其实是阿里的微服务解决方案,是阿里巴巴结合自身微服务实践,开源的微服务全家桶,在Spring Cloud项目中孵化成为Spring Cloud的子项目。第一代的Spring Cloud标准中很多组件已经停更,如:Eureak,zuul等。所以Spring Cloud Alibaba很有可能成为Spring Cloud第二代的标准实现,所以许多组件在业界逐渐开始使用,已有很多成功案例。

值得一提的是Spring Cloud Alibaba对Dubbo做了很好的兼容,同时也提供了一些强大的功能,如 Sentinel 流控 ,Seata 分布式事务,Nacos 服务发现与注册等等。

2.Alibaba功能

Spring Cloud Alibaba是阿里巴巴结合自身的微服务实践开源的微服务全家桶,我个人觉得其组件比Spring Cloud 中的组件更加好用和强大。并且对的Spring Cloud组件做了很好的兼容。比如在Spirng Cloud Alibaba中依然可以使用Feign作为服务调用方式,使用Eureak做服务注册发现等等。Spring Cloud Alibaba主要的功能如下:

  • 流控制和服务降级:支持WebServlet,WebFlux,OpenFeign,RestTemplate,Dubbo访问限制和降级流的功能。它可以在运行时通过控制台实时修改限制和降级流的规则,并且还支持监视限制和降级度量标准。
  • 服务注册和发现:可以注册服务,并且客户可以使用Spring托管的bean(自动集成功能区)发现实例。(Nacos)
  • 分布式配置:支持分布式系统中的外部配置,配置更改时自动刷新。(Nacos)
  • Rpc服务:扩展Spring Cloud客户端RestTemplate和OpenFeign以支持调用Dubbo RPC服务。
  • 事件驱动:支持构建与共享消息系统连接的高度可扩展的事件驱动微服务。
  • 分布式事务:支持高性能且易于使用的分布式事务解决方案。
  • 阿里云对象存储:大规模,安全,低成本,高度可靠的云存储服务。支持随时随地在任何应用程序中存储和访问任何类型的数据。
  • 阿里云SchedulerX:准确,高度可靠,高可用性的计划作业调度服务,响应时间在几秒钟内。
  • 阿里云短信:阿里云短信服务覆盖全球,提供便捷,高效,智能的通信功能,帮助企业快速联系客户。

3.Nacos服务注册与发现

3.1Nacos和Eureka的区别?

Eureka 服务发现Pull的方,Nacos它是采用Pull和push的方式(简单理解,eureka是每隔30秒到服务注册中心拉取通信地址,但是如果31s的时候注册中心通信地址发生改变了之后,要等到下一次拉取的时候,客户端才会发现通信地址发生了改变,但是Nacos它采用的方式是pull和push2种方案来保证数据的实时更新--如果注册中心通信地址发生改变,nacos会主动向客户端推送最新的通信地址)

3.2Nacos安装

下载地址:Releases · alibaba/nacos · GitHub

启动Nacos:解压后,

  • windows执行bin目录下的startup命令 :startup.cmd -m standalone
  • linux 执行 :sh startup.sh -m standalone

3.3Nacos配置

3.3.1基于数据库持久化
第一步:修改配置文件

找到nacos安装目录config/application.properties 文件,编辑数据库信息,修改内容如下

spring.datasource.platform=mysql### Count of DB:
db.num=1### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123456
第二步:导入sql

找到config/ nacos-mysql.sql  文件 ,创建数据库 nacos-config,然后导入该sql脚本文件

3.3.2:启动方式集群/单机
set MODE="standalone"
3.3.3:开启账号密码认证

开启鉴权之后nacos的application.properties中的配置信息为:

### If turn on auth system:
nacos.core.auth.system.type=nacos
nacos.core.auth.enabled=true

3.4快速入门

3.4.1导包

1.父工程管理版本

<dependencyManagement><dependencies><!--SpringClou-alibaba依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2021.0.5.0</version><type>pom</type><scope>import</scope></dependency><!--SpringCloud依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2021.0.5</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

2.导入nacos客户端

 <!--服务注册与发现--><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>
3.4.2编写配置文件yml
server:port: 1010
spring:application:name: user-servercloud:nacos:discovery:server-addr: 127.0.0.1:8848	#注册中心地址
3.4.3命名空间

修改yml配置文件

server:port: 1010
spring:profiles:active: devapplication:name: user-servercloud:nacos:discovery:server-addr: localhost:8848 #注册中心group: DEFAULT_GROUPnamespace: 1a230c28-e48a-4ef0-86ca-38d0ef85d8e0 #命名空间的ID
3.4.4开启认证
server:port: 1010
spring:profiles:active: devapplication:name: user-servercloud:nacos:discovery:server-addr: localhost:8848 #注册中心username: nacospassword: nacosgroup: DEFAULT_GROUPnamespace: 1a230c28-e48a-4ef0-86ca-38d0ef85d8e0 #命名空间的ID
3.4.5引入配置中心
3.4.5.1导包
 <!--配置中心--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!--对bootstrap.yaml的支持--><dependency><groupId>org.springframework.cloud </groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency>
3.4.5.2修改配置文件bootstrap.yml
spring:cloud:nacos:config:  #配置中心server-addr: localhost:8848 #配置中心地址namespace: alibaba-dev    #命名空间prefix: pay-application   #配置文件前缀file-extension: yml     #配置文件格式username: nacospassword: nacos
3.4.5.3Nacos添加配置文件

3.4.6抽取公共配置文件
3.4.6.1修改配置文件
spring:cloud:nacos:config:server-addr: localhost:8848 #配置中心地址namespace: alibaba-dev    #命名空间prefix: pay-application   #配置文件前缀file-extension: yml     #配置文件格式shared-configs: #共享的配置文件- dataId: shared-config.ymlrefresh: trueusername: nacospassword: nacos
3.4.6.2Nacos添加抽取公共配置文件

4.Sentienl限流

4.1快速入门

4.1.1导包
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
4.1.2配置
spring:cloud:sentinel:transport:dashboard: localhost:1111
4.1.3@SentinelResource配置限流接口
  @GetMapping("/user/{id}")//限流降级@SentinelResource(value="getById",blockHandler="exceptionHandler")public User getById(@PathVariable Long id){System.out.println(notify);return new User(id,"zs:"+id, "我是zs");}// 限流与阻塞处理 : 参数要和 被降级的方法参数一样public User exceptionHandler(@PathVariable Long id, BlockException ex) {ex.printStackTrace();System.out.println("限流了...");return new User(-1L,"限流了","限流了");}

4.2Sentinel设置限流策略

4.2.1Sentinel流控模式
4.2.1.1直接

Sentinel默认的流控处理就是【直接->快速失败】,QPS达到阈值,当前资源直接失败。在流控规则中配置如下:

4.2.1.2关联

关联的资源达到某个阈值,限流自己,如:限流的资源是/user/delete ,关联的资源是/user/list,当/user/list达到阈值,限流user/delete , 举例: 支付并发太高,可以限制下单的流量

4.2.1.2链路

限流线路调用链路的入口,如 /user/list 资源中 调用了 /dept/list ,对/dept/list添加限流,当/dept/list达到阈值,其实限流的是/user/list,因为他是访问的入口

4.2.2Sentinel流控效果
4.2.2.1快速失败

快速失败:(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)是默认的流控方式,当流量达到阀值直接返回异常,QPS达到任何规则阈值后,后续请求就会立即拒绝,并抛出FlowException 异常。简单理解:并发太高,直接请求拒绝

4.2.2.2Warm Up预热

Warm Up预热:(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,根据codeFactor(默认3)的值,从(阀值/codeFactor)为初始阀值,经过预热时长,才到达设置的QPS的阀值,即预热/冷启动方式。简单理解:慢慢的增大处理并发的能力

提示:初始的QPS阈值为 100 / 3 =33 ,10秒后 QPS阈值达到 100.

当系统长期并发不高,流量突然增加可能会直接把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值的上限,给系统一个预热的时间,避免冷系统被压垮。

4.2.2.3排队等待

排队等(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER),忽然增加的请求并发量达到了限流阈值后续请求会被拒绝,有时候我们可能更希望后续的请求可以加入队列进行排队,慢慢执行,而不是直接拒绝请求,这种方式后严格控制请求通过的时间间隔,也即是让请求以均匀的速度通过,对应的是漏桶算法,这种方式主要用于处理间隔性突发的流量,例如消息队列。 简单理解:突发流量处理不过来,让请求排队。

4.2.2.4热点限流

还有一种特殊的动态限流规则,用于限制动态的热点资源 , 比如对同一个用户的请求频率做限定,比如对参数进行限定,比如对参数的值做限定(比如对商品ID为1的资源做限流)。

4.2.2.4.1参数限流

参数限流就是 对资源的参数进行限流,我们来编写一个方法,接受两个参数:p1,和p2并设置好限流降级

//限流降级
@SentinelResource(value="/parameterLimit",blockHandler="parameterLimitHandler")
@GetMapping(value="/parameterLimit")
public String parameterLimit(@RequestParam("p1") String p1 ,@RequestParam("p2") String p2){return "parameterLimit方法调用成功...";
}
// 限流与阻塞处理
public String parameterLimitHandler(@RequestParam("p1") String p1 ,@RequestParam("p2") String p2,BlockException ex) {return "限流了...";
}

配置热点规则 , 对第一个参数限流 , 当第一个参数超过了1的QPS就熔断降级。

4.2.2.5参数值限流

对某一个参数的值满足某种条件的时候就进行限流,如下配置

意思是第一个参数的值为 haha 的时候限流阈值为10 , 超过 QPS > 10的并发就限流。

举例:应用场景比如说商品名称为“华为p40”的商品并发特别高,我们可以针对参数商品名为“华为p40”的商品进行限流

4.2.2.5系统规则

配置全局限流规则

系统规则可以看做是总的限流策略,所有的只要都要受到系统规则的限制。

上面的意思是最大并发只能允许 10 个线程数,并且是作用于全局的。

4.3Gateway网关集成sentienl

4.3.1导包
<!--    限流和gataway使用-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId></dependency><dependency>	<groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>
4.3.2修改配置文件
spring:cloud:sentinel:transport:dashboard: localhost:1111
4.3.3配置限流规则

启动Gateway,登录sentinel控制台,对url资源进行流控限制,配置方式和前面的配置方式一样

4.3.4自定义降级数据
@Configuration
public class SentinelConfig {public SentinelConfig(){GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {@Overridepublic Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {return ServerResponse.ok().body(Mono.just("限流啦,请求太频繁"),String.class);}});}
}

4.4Sentienl集成Nacos持久化限流规则

4.4.1导包
<!--Sentinel和Nacos做持久的-->
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId><version>1.5.2</version>
</dependency>
4.4.2配置Nacos持久化地址
cloud:sentinel: #限流与熔断datasource:flow:nacos: #限流持久配置server-addr: localhost:8848    #使用nacos的持久dataId: sentinel-pay-flow    #获取限流的数据源的dataIdgroupId: DEFAULT_GROUPrule-type: flow #类型:限流namespace: alibaba-devusername: nacospassword: nacos

NacosDataSourceProperties 配置类具体含义如下:

  • spring.cloud.sentinel.datasource.ds.nacos.server-addr:nacos的访问地址
  • spring.cloud.sentinel.datasource.ds.nacos.groupId:nacos中存储规则的groupId
  • spring.cloud.sentinel.datasource.ds.nacos.dataId:nacos中存储规则的dataId
  • spring.cloud.sentinel.datasource.ds.nacos.rule-type:该参数是用来定义存储的规则类型。所有的规则类型可查看枚举类:...datasource.RuleType,每种规则的定义格式可以通过各枚举值中定义的规则对象来查看,比如限流规则可查看:...flow.FlowRule

简而言之,这里是配置了Sentinel持久化针对于Nacos的相关信息,程序会去地址为localhost:8848的Nacos中查找DataId为 application-user-sentinel-dev,GourpId为 DEFAULT_GROUP的文件作为限流策略(rule-type: flow代表限流)。

4.4.3Nacos持久化Sentinel限流规则配置
第一步:在配置列表增加配置:
[{"resource": "getOrderById","limitApp": "default","grade": 1,"count": 10,"strategy": 0,"controlBehavior": 0,"clusterMode": false}]

这里做一个解释

  • resource:对那个资源进行限流
  • limitApp:这个是流控的调用者,default 代表不区分调用者
  • grade:限流方式0是根据并发数量限流,1是表根据QPS来限流
  • count:限流阈值,达到这个阈值就被限流,触发降级。
  • strategy:基于调用链的流控制策略。0 直接,1 关联 2 链路
  • controlBehavior:流控效果,0 直接拒绝,1是Warm Up,2是匀速排队
  • clusterMode:是否为集群
第二步:启动sentienl界面

这里我们看到,我们并没有在Sentinel设置流控规则,而是通过Nacos配置的流控规则,在客户端对Sentinel做Nacos持久配置,那么Sentinal自动会去同步Nacos中的流控规则,同时同步到客户端本地,只要Nacos是做了持久化的,流控规则就不会丢失。

5.Sentienl熔断

Sentinel的服务熔断机制会对`调用链上的某个不稳定(宕机,异常,超时)的资源,做出请求限制,快速失败,避免影响到其它的服务而导致级联错误`。资源熔断后,在`后续的一定时间(时间窗口)之内,对该服务的请求都自动熔断,抛出 DegradeException异常。`

Sentinel拥有比Hystrix更强大和丰富的功能,能满足我们的各种应用场景,并且经历过淘宝双十一的考验,是微服务架构中熔断机制的不二选择

5.1Sentienl熔断快速入门

5.1.1@SentinelResource`注解的fallback 属性指定降级方法
// 限流降级
public User exceptionHandler(@PathVariable Long id, BlockException ex) {
ex.printStackTrace();
System.out.println("限流了...");
return new User(-1L,"限流了","限流了");
}
// 熔断降级,参数和返回值与源方法一致
public User getByIdfallback(@PathVariable Long id){System.out.println(notify);return new User(id,"zs:"+id, "熔断托底了");
}@GetMapping("/user/{id}")
//限流降级
@SentinelResource(value="user",blockHandler="exceptionHandler",fallback = "getByIdfallback")
public User getById(@PathVariable Long id){int i = 1 / 0;	//方法异常,触发熔断return new User(id,"zs:"+id, "我是zs");
}

注意:这里可以通过 @SentinelResource注解的 exceptionsToTrace 属性忽略异常,即针对某个异常不熔断

5.1.2配置降级策略

在Sentinel控制台,在族点链路菜单中找到资源,然后点击“降级”按钮添加降级策略,如下:

5.1.3配置熔断策略

5.2降级策略

5.2.1平均响应RT

这里配置的RT是200意思是对资源的多次请求平均响应时间都超过200毫秒,意思是 1s 内持续进入 5 个请求(即 QPS >= 5),这五个请求的平均响应时间都超过了200,后续的2秒之内(时间窗口)请求这个方法都被熔断,触发降级

总结一下:RT其实就是**平均相应时间太长**资源熔断

5.2.2异常比例

这个资源的异常比例超过了0.5,即10个请求有5个都异常了,资源被熔断,在接下来的2秒钟之后请求这个方法都被熔断,触发降级。

总结一下:异常比例就是按**照资源的请求失败率**来熔断。

5.3.3异常数

这里的意思是1秒内10个超过2个异常请求,服务进行熔断。后续请求都拒绝。

注意:异常降级仅针对业务异常,对 Sentinel 限流降级本身的异常(BlockException)不生效

总结一下:异常数就是按照 一分钟的异常的数量 来熔断。

5.3Feign整合熔断

5.3.1导入Sentienl包
5.3.2开启Sentinel
feign:sentinel:enabled: true #熔断
5.3.3fallback给Feign接口降级
@FeignClient(value = "user-server",path = "/user",fallbackFactory = UserFallback.class)
public interface UserFegin {@GetMapping("/{id}")String hello(@PathVariable Long id);
}
5.3.4编写降级类
@Component
public class UserFallback implements FallbackFactory<UserFegin> {@Overridepublic UserFegin create(Throwable cause) {return id -> "服务挂了,fegin熔断了";}
}

5.4Sentienl熔断持久化Nacos

5.4.1导包
<!--Sentinel和Nacos做持久的--><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId><version>1.5.2</version></dependency>
5.4.2修改配置文件
 cloud:sentinel: #限流与熔断datasource:flow:nacos: #限流持久配置server-addr: localhost:8848    #使用nacos的持久dataId: sentinel-pay-flow    #获取限流的数据源的dataIdgroupId: DEFAULT_GROUPrule-type: flow #类型:限流namespace: alibaba-devusername: nacospassword: nacosdegrade: #降级的配置nacos:server-addr: 127.0.0.1:8848dataId: sentinel-pay-degradegroupId: DEFAULT_GROUPrule-type: degradenamespace: alibaba-devusername: nacospassword: nacos
5.4.3Nacos持久化Sentinel熔断规则
[{"resource": "GetUserByID","grade": 0,"count": 10,"timeWindow": 5}
]
  • resources : 资源名
  • grade : (RT)慢调用比例 0  ;异常比例 1 ;异常数 2;
  • count : 最大RT,最大平均响应时间
  • timeWindow :时间窗口,即熔断时长

6.SpringBootAdmin

1.简介

我们知道在微服务架构的应用中服务众多,对于各个微服务的监控是微服务架构应用中不可缺少的一个环节,比如:服务的内存使用情况,JVM信息等等都需要做数据监控以便在资源使用告急时方便运维人员做出相应的配置调整。

SpringBoot Admin 它是在 Spring Boot Actuator 的基础上用于监控 Spring Boot 的应用,且提供简洁的可视化 WEB UI界面。Spring Boot Admin 提供了很多功能,可以监控如:spring-boot项目的基本信息,详细的Health信息、内存信息、JVM信息、垃圾回收信息、各种配置信息(比如数据源、缓存列表和命中率)等,还可以直接修改logger的level

2.快速入门

2.1搭载服务端
2.1.1导包
  <dependencies><!-- 实现 Spring Boot Admin Server 服务端 --><dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-server</artifactId><version>2.6.1</version></dependency><!--nacos依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency><!--nacos配置中心依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
2.1.2启动类加注解@EnableAdminServer
@SpringBootApplication
@EnableAdminServer
public class AdminApplication{...
}
2.1.3配置yaml文件
management:endpoints:web:exposure:include: "*"  #暴露所有的端点我们可以看到更多应用相关信息endpoint:health:show-details: ALWAYS  #health endpoint是否必须显示全部细节health:defaults:enabled: false #禁用健康检查,启动可能报错
2.1.4浏览器访问服务端

2.2服务集成客户端
2.2.1导包
<dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-client</artifactId><version>2.6.1</version>
</dependency>
2.2.2yml配置客户端
# 2.0开始,actuator默认不开放,所以要设置为开放
management:endpoints:web:exposure:include: "*"  #暴露所有的端点我们可以看到更多应用相关信息endpoint:health:show-details: ALWAYS  #health endpoint是否必须显示全部细节spring:boot:admin:client:url: http://localhost:10200  #监控中心地址instance:name: service-name #服务名

7.SpringBoot集成Dubbo远程调用

1.代码演示结构

parent---父工程
springcloudalibaba-dubbo-api---公共模块
springcloudalibaba-dubbo-consumer-1080---消费者(调用方)
springcloudalibaba-dubbo-server-1070---提供者(被调用方)

2.编写公共模块的公共方法

//用户的API接口
public interface UserService {String getUserInfo(Long id);
}

注意:这个接口是公用的,消费者和提供者都会用到

3.编写提供者模块(被调用方)

3.1导入包
<dependencies><!-- 第一步中构建的公共API包 --><dependency><groupId>org.example</groupId><artifactId>springcloudalibaba-dubbo-api</artifactId><version>1.0-SNAPSHOT</version></dependency><!--    监控的依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
<!--    整合dubbo--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId></dependency><!--   nacos服务发现--><dependency><groupId>com.alibaba.cloud </groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency></dependencies>
3.2修改yml配置文件
spring:application:name: dubbo-providercloud:nacos:discovery:server-addr: localhost:8848 #nacos注册中心main:allow-bean-definition-overriding: true #设置是否覆盖Bean定义 ,防止bean的重复定义而报错
server:port: 1070
dubbo:scan:base-packages: org.example.service #dubbo 的api实现类扫描包protocol:name: dubbo #通信协议:dubboport: 20880 #dubbo通信端口registry:address: spring-cloud://localhost #注册中心地址,使用springcloud的注册中心
3.3实现暴露被调用的接口

该实现是提供者服务的具体服务的实现,在这里去实现 UserService 接口,返回相关的数据,消费者调用提供者的时候就是调用的该实现,---- 我们可以简单的理解为这里暴露了一个服务准备让消费者去调用

//用户的API接口实现
//@Service : dubbo的注解 , 通过该注解把api发布出去
@org.apache.dubbo.config.annotation.Service
public class UserServiceImpl implements UserService {@Overridepublic String getUserInfo(Long id) {return "成功获取到用户信息";}
}

需要注意的是,这里使用的是 dubbo的@Service注解,意思是发布一个远程服务

4.编写消费者模块(调用方)

4.1导包
<dependencies><!-- 第一步中构建的API包 --><dependency><groupId>org.example</groupId><artifactId>springcloudalibaba-dubbo-api</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--    整合dubbo--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId></dependency><dependency><groupId>com.alibaba.cloud </groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency></dependencies>
4.2修改yml配置文件
spring:application:name: dubbo-consumercloud:nacos:discovery:server-addr: localhost:8848 #nacos注册中心main:allow-bean-definition-overriding: true #设置是否覆盖Bean定义 ,防止bean的重复定义而报错
server:port: 1080
dubbo:scan:base-packages: org.example.service #dubbo 的api实现类扫描包protocol:name: dubbo #通信协议:dubboport: 20881 #dubbo通信端口registry:address: spring-cloud://localhost #注册中心地址,使用springcloud的注册中心cloud:subscribed-services: dubbo-provider #订阅的服务,指向提供者的服务名
4.3发起远程调用
@RestController
public class UserController {@org.apache.dubbo.config.annotation.Referenceprivate UserService userService ;@GetMapping("/userinfo/{id}")public String getUserInfo(@PathVariable("id")Long id){return userService.getUserInfo(id);}
}

这里通过 userService.getUserInfo 实现远程服务的调用,感觉在调用本地Service,其实不是,在UserService上使用的是@Reference标签而不是@Autowired 自动注入,通过@Reference标签,Dubbo会自动代理UserServcie,实现服务的远程调用,所以这里其实调用的是提供者服务的UserService实现。

5.总结

1.首先提供者服务对UserService做了实现,并且通过 @Service发布服务

2.消费者服务在Controller中通过@Reference引入UserService ,该UserServer接口当然也会被代理掉,在调用接口时会向提供者发起远程访问

3.提供者监听到请求,执行相关的业务逻辑,并返回数据

4.消费者获取到结果,最终把数据展示到浏览器上

相关文章:

SpringCloud-Alibaba第二代微服务快速入门

1.简介 Spring Cloud Alibaba其实是阿里的微服务解决方案&#xff0c;是阿里巴巴结合自身微服务实践,开源的微服务全家桶&#xff0c;在Spring Cloud项目中孵化成为Spring Cloud的子项目。第一代的Spring Cloud标准中很多组件已经停更,如&#xff1a;Eureak,zuul等。所以Sprin…...

JSON字符串转换成对象

在Java中&#xff0c;将JSON字符串转换成对象是一个常见的操作&#xff0c;特别是在处理Web服务或API时。这通常通过使用第三方库来实现&#xff0c;因为Java标准库&#xff08;Java SE&#xff09;本身并不直接支持JSON的序列化和反序列化。最常用的库之一是Jackson和Gson。下…...

第三十五章 结合加密和签名

文章目录 第三十五章 结合加密和签名使用非对称密钥签名并加密使用非对称密钥加密并签名 第三十五章 结合加密和签名 可以在同一条消息中加密和签名。在大多数情况下&#xff0c;只需组合前面主题中给出的方法即可。本主题讨论了多种场景。 使用非对称密钥签名并加密 要签名…...

FastAPI 第八课 -- 路径操作依赖项

目录 一. 前言 二. 依赖项&#xff08;Dependencies&#xff09; 2.1. 依赖注入 2.2. 依赖项的使用 三. 路径操作依赖项的基本使用 3.1. 预处理&#xff08;Before&#xff09; 3.2. 后处理&#xff08;After&#xff09; 四. 多个依赖项的组合 五. 异步依赖项 一. 前…...

大厂面试真题-说一下Mybatis的缓存

首先看一下原理图 Mybatis提供了两种缓存机制&#xff1a;一级缓存&#xff08;L1 Cache&#xff09;和二级缓存&#xff08;L2 Cache&#xff09;&#xff0c;旨在提高数据库查询的性能&#xff0c;减少数据库的访问次数。注意查询的顺序是先二级缓存&#xff0c;再一级缓存。…...

jQuery UI 工作原理

jQuery UI 工作原理 引言 jQuery UI 是建立在 jQuery 库之上的一个开源 JavaScript 库,它提供了一系列用户界面交互、特效、小部件和主题。它旨在简化 HTML 用户界面的开发,使开发者能够轻松地创建具有丰富交互性和视觉吸引力的网页。本文将深入探讨 jQuery UI 的工作原理,…...

CS 工作笔记:SmartEdit 里创建的是 CMS Component

下图是在 SmartEdit 里创建的 cms Component&#xff0c;在 Back-Office 里的截图&#xff1a; SAP Commerce Cloud 的 CMS Component 是其内容管理系统 (CMS) 的核心组成部分&#xff0c;它提供了对在线商店或平台内容的灵活管理。通过这些组件&#xff0c;用户能够在不涉及复…...

Java面试经验总结之SSM框架+springboot

一、spring 1.Spring 是什么&#xff1f; 答&#xff1a;spring 是一个轻量级的容器框架&#xff0c; ioc 和 aop 是他的核心。spring 将传统的代码以来形式&#xff0c;变为从容器中获取&#xff0c;提高了开发效率&#xff0c;非常的方便。spring 衍生出了很多生态&#x…...

Unity 热更新(HybridCLR+Addressable)-设置打包路径和加载路径、打开Hosting服务、打包

四、设置打包和加载路径 五、打开Hosting服务 六、打包 打包完成后路径在Assets同级目录下的ServerData 但是目前没有资源文件对比 修改上面设置后再次打包 里面多了哈希和JSON文件&#xff0c;这俩个就是用于资源对比...

享元(轻量级)模式

简介 享元模式&#xff08;Flyweight Pattern&#xff09;又叫作轻量级模式&#xff0c;是对象池的一种实现。类似线程池&#xff0c;线程池可以避免不停地创建和销毁多个对象&#xff0c;消耗性能。享元模式提供了减少对象数量从而改善应用所需的对象结构的方式。其宗旨是共享…...

基于php的幸运舞蹈课程工作室管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…...

NLP任务的详细原理与步骤的详细讲解

1. 文本分类 原理&#xff1a; 特征提取&#xff1a;文本分类首先将文本转化为数值特征&#xff0c;常用方法包括词袋模型、TF-IDF、Word Embeddings&#xff08;如Word2Vec、GloVe&#xff09;和BERT等预训练模型。模型训练&#xff1a;模型&#xff08;如SVM、神经网络&…...

Kotlin 处理字符串和正则表达式(二十一)

导读大纲 1.1 处理字符串和正则表达式1.1.1 分割字符串1.1.2 正则表达式和三引号字符串1.1.3 多行三引号字符串IntelliJ IDEA 和 Android Studio 中三重引号字符串内部的语法高亮显示 1.1 处理字符串和正则表达式 Kotlin 字符串与 Java 字符串完全相同 可以将 Kotlin 代码中创建…...

一站式大语言模型API调用:快速上手教程

智匠MindCraft是一个强大的AI工具及开发平台&#xff0c;支持多种大语言模型和多模态AI模型。本文将详细介绍如何通过API调用智匠MindCraft中的大语言模型&#xff0c;帮助开发者快速上手。 注册与登录 访问智匠MindCraft官网&#xff0c;注册并登录账号。 进入开发者平台&…...

【TabBar嵌套Navigation案例-新特性页面-代码位置 Objective-C语言】

一、接下来,我们来说这个新特性页面 1.首先,看一下我们的示例程序,这里改一下,加一个叹号, command + R, 好,首先啊,这里边有一个新特性页面,当我这个程序是第一次安装、第一次运行、还有呢、就是当这个应用程序更新的时候,我应该去加载这个新特性页面, 然后呢,这…...

程序员如何提升并保持核心竞争力?——深入钻研、广泛学习与软技能的培养

一、引言  随着人工智能的不断发展&#xff0c;尤其是AIGC系列大语言模型的涌现&#xff0c;AI辅助编程工具正在日益普及&#xff0c;这对程序员的工作方式产生了深刻的影响。面对这一变革&#xff0c;程序员应如何应对&#xff1f;是专注于某个领域深耕细作&#xff0c;还是…...

Linux之Docker虚拟化部署

上传docker安装包 解压安装包 将解压后的docker文件夹移动到/usr/local/文件夹下 docker 启动命令/usr/local/docker/dockerd 但是启动报错&#xff0c;意思是没有docker用户组 创建docker用户组&#xff0c;执行完会生成套接字文件 将套接字文件加入该用户组管理 第二个错误原…...

重构部队信息安全:部队涉密载体建设新策略

一、完善保密体系架构 1. 加强保密规章制度&#xff1a;制定或刷新关于机密信息管理的相关规定&#xff0c;明确机密信息的生成、复制、传输、使用、储存及销毁等核心环节的操作准则与责任分配&#xff0c;确保整个流程的标准化运作。 2. 明确个人保密义务&#xff1a;通过保密…...

使用Node.js的readline模块逐行读取并解析大文件

在Node.js环境中处理大文件是一个常见的需求&#xff0c;尤其是在处理日志文件、数据库导出、或任何形式的大规模文本数据时。由于Node.js是基于事件循环和非阻塞I/O的&#xff0c;它非常适合处理这类任务。然而&#xff0c;直接将整个文件内容加载到内存中可能会导致内存溢出&…...

浅谈软件安全开发的重要性及安全开发实践

在当今数字化时代&#xff0c;软件已成为企业运营的核心驱动力。然而&#xff0c;随着网络环境的日益复杂和黑客技术的不断演进&#xff0c;软件安全问题日益凸显&#xff0c;成为企业不可忽视的重大挑战。本文将从法律法规要求、企业核心数据资产保护、企业信誉等角度&#xf…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...