首页 > 其他分享 >服务间调用实例

服务间调用实例

时间:2023-09-05 15:45:39浏览次数:44  
标签:调用 服务 name spring boot 实例 starter public cloud

Dubbo 解决方案

参考文档

common
项目初始化

新建空的 Maven 项目

公共接口声明
public interface SayService {

   /**
    * 根据名字say hello
    * @param name 名字
    * @return name + ,hello!
    */
   String sayHelloByName(String name);
}
依赖安装
mvn install
provider
项目初始化

初始化为 Spring Boot 项目(版本:2.7.14)

Maven 依赖
  • Spring Boot 基础依赖

  • dubbo 基础依赖

  • dubbo 注册中心依赖:相当于 nacos-client

<dependencies>
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter</artifactId>
   </dependency>

   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-test</artifactId>
       <scope>test</scope>
   </dependency>

   <dependency>
       <groupId>org.apache.dubbo</groupId>
       <artifactId>dubbo-spring-boot-starter</artifactId>
       <version>3.0.9</version>
   </dependency>

   <dependency>
       <groupId>org.apache.dubbo</groupId>
       <artifactId>dubbo-registry-nacos</artifactId>
       <version>3.0.9</version>
   </dependency>

   <dependency>
       <groupId>org.example</groupId>
       <artifactId>common</artifactId>
       <version>1.0-SNAPSHOT</version>
   </dependency>

</dependencies>
application.yml
server:
port: 14511
spring:
application:
  name: provider-service
main:
  allow-bean-definition-overriding: true
dubbo:
application:
  name: provider-service
registry:
  address: nacos://127.0.0.1:8848
  username: nacos
  password: nacos
scan:
  base-packages: com.example.provider.service.impl
protocol:
  name: dubbo
  port: 15511
公共接口实现
@DubboService
public class SayServiceImpl implements SayService {

   @Override
   public String sayHelloByName(String name) {
       return name + ",hello!";
  }
}
启动类
@EnableDubbo
@SpringBootApplication
public class ProviderApplication {

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

}
consumer
项目初始化

初始化为 Spring Boot 项目(版本:2.7.14)

Maven 依赖
<dependencies>
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter</artifactId>
   </dependency>

   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-test</artifactId>
       <scope>test</scope>
   </dependency>

   <dependency>
       <groupId>org.apache.dubbo</groupId>
       <artifactId>dubbo-spring-boot-starter</artifactId>
       <version>3.0.9</version>
   </dependency>

   <dependency>
       <groupId>org.apache.dubbo</groupId>
       <artifactId>dubbo-registry-nacos</artifactId>
       <version>3.0.9</version>
   </dependency>

   <dependency>
       <groupId>org.example</groupId>
       <artifactId>common</artifactId>
       <version>1.0-SNAPSHOT</version>
   </dependency>

</dependencies>
application.yml
server:
port: 14510
spring:
application:
  name: consumer-serivce
main:
  allow-bean-definition-overriding: true
dubbo:
application:
  name: consumer-serivce
registry:
  address: nacos://127.0.0.1:8848
  username: nacos
  password: nacos
Controller
@RestController
@RequestMapping("/demo/say")
public class SayController {

   @DubboReference
   private SayService sayService;

   @GetMapping("/sayHello")
   public ResponseEntity<String> sayHello(@RequestParam("name") String name) {
       return ResponseEntity.ok(sayService.sayHelloByName(name));
  }
}
启动类
@EnableDubbo
@SpringBootApplication
public class ConsumerApplication {

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

}
测试流程
  1. Provider 启动

  2. Consumer 启动

  3. 通过 Consumer 的 Controller 访问 Provider 的 Service

    curl "http://127.0.0.1:14510/demo/say/sayHello?name=test"

 

RestTemplate 按 IP 调用

本质上就是在项目内部发送一个 HTML 请求,由于 HTML 的跨平台特性,后端发送的请求等价于前端发过来的请求

RestTemplate restTemplate = new RestTemplate();
String name = "Ba11ooner";
restTemplate.getForEntity("http://172.0.0.1:8080/demo/say?name="+ name,null);

RestTemplate + Nacos 实现按名调用

关键点在于配置好 Feign 和 LoadBalancer

provider
项目初始化

初始化为 Spring Boot 项目(版本:2.7.14)

本质上是一个通过 Controller 暴露内部服务的普通 Web 后端

Maven 依赖
  • spring-boot-starter-web:这是Spring Boot框架的核心依赖,用于创建Web应用。

  • spring-cloud-alibaba-dependencies:这是Spring Cloud Alibaba的依赖管理器,用于集成Spring Cloud Alibaba的各个组件。

  • spring-cloud-starter-alibaba-nacos-discovery:这是用于集成Nacos作为服务注册与发现的组件。

    <dependencies>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
       </dependency>

       <dependency>
           <groupId>com.alibaba.cloud</groupId>
           <artifactId>spring-cloud-alibaba-dependencies</artifactId>
           <version>2021.0.5.0</version>
           <type>pom</type>
       </dependency>

       <dependency>
           <groupId>com.alibaba.cloud</groupId>
           <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
           <version>2021.0.5.0</version>
       </dependency>
</dependencies>
application.yaml
server:
port: 8080
spring:
application:
  name: provider-service
cloud:
  nacos:
    discovery:
      server-addr: 127.0.0.1:8848
Controller
@RestController
@RequestMapping("/demo")
public class SayController {
 @Resource
SayService service;

 @GetMapping("/say")
 public String getNameByGet(@RequestParam String name) {
     return service.sayHelloByName(name);
}
 
}
启动类
@EnableDiscoveryClient
@SpringBootApplication
public class ProviderApplication {

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

}
consumer
项目初始化

初始化为 Spring Boot 项目(版本:2.7.14)

本质上是通过 FeignClient + Naocs 实现内部按名调用服务

Maven 依赖
  • spring-boot-starter-web:启动Spring Boot的Web应用程序所需的依赖包。

  • spring-cloud-starter-loadbalancer:提供负载均衡功能的依赖包。它包含了相应的负载均衡算法和服务发现的实现。

  • spring-cloud-starter-openfeign:使用OpenFeign进行服务间的通信所需的依赖包。OpenFeign是一个声明式的Web服务客户端,简化了服务间的调用过程。

  • spring-cloud-dependenciesspring-cloud-alibaba-dependencies 是依赖管理POM文件,用于确保Spring Cloud 和 Spring Cloud Alibaba 组件版本之间的兼容性。

<dependencies>
 
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
 
 <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-loadbalancer</artifactId>
   </dependency>

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

</dependencies>


<dependencyManagement>
   <dependencies>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-dependencies</artifactId>
           <version>2021.0.5</version>
           <type>pom</type>
           <scope>import</scope>
       </dependency>
       <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>
   </dependencies>
</dependencyManagement>
application.yaml
server:
port: 8081
spring:
application:
  name: consumer-serivce
cloud:
  nacos:
    discovery:
      server-addr: 127.0.0.1:8848
  loadbalancer:
    nacos:
      enabled: true
配置类
public class LoadBalancerConfig {
   //将官方提供的 RandomLoadBalancer 注册为Bean
   @Bean
   public ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory){
       String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
       return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
  }
}
//BeanConfig
@Configuration
@LoadBalancerClient(
       //指定为 provider-service 服务,只要是调用此服务都会使用我们指定的策略
value = "provider-service",      
       configuration = LoadBalancerConfig.class)   //指定我们刚刚定义好的配置类
public class BeanConfig {
   @Bean
   @LoadBalanced
   RestTemplate template(){
       return new RestTemplate();
  }
}
FeignClient
@FeignClient("provider-service")
public interface DemoClient {

   @GetMapping("/demo/say")
   void getNameByGet(@RequestParam String name);

}
Controller
//实现服务调用,本质上并不承担服务执行的职责
@RestController
@RequestMapping("/demo/say")
public class InvokeController {
 
   @Autowired
   private LoadBalancerClient loadBalancerClient;

   // 创建 RestTemplate 实例
   @Autowired
   private RestTemplate restTemplate;

   @Resource
   DemoClient demoClient;
 
   void requestByGet() {
       ServiceInstance serviceInstance = loadBalancerClient.choose("provider-service");
       String name = "Ba11ooner";
       demoClient.getNameByGet(name);
  }
 
 
   @GetMapping("/request")
   public ResponseEntity<String> sendRequest() {
       requestByGet();
       return ResponseEntity.ok("200");
  }
}
启动类
@EnableDiscoveryClient
@SpringBootApplication
public class ProviderApplication {

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

}
 


 

标签:调用,服务,name,spring,boot,实例,starter,public,cloud
From: https://www.cnblogs.com/ba11ooner/p/17679823.html

相关文章

  • jmeter JSON提取器匹配值设置以及参数值调用
    JSON匹配值设置以及参数调用-1:获取的返回值可能有多个,调用参数值时:${参数名_数字},例如:获取第一个值${参数名_1},获取第3个值${参数名_3}   数字:获取参数值中的第几个值,例如设置为5,获取返回值的第5个值,参数调用:${参数名}0:随机获取1个值,参数调用:${参数名}注意:匹配值有......
  • DNS域名解析服务2
    11.1DNS服务2MX记录邮件交换记录:当邮箱服务器负载过高,添加服务器来使用,使用轮循负载均衡,来实现服务器交换使用@ IN MX 优先级 主机名主机名 IN A IP地址[email protected]如: IN MX 5 mail1 IN MX 10 mail2mail1 IN A 192.168.1.3mail2 IN A 192.168.1.4命令nslookup-qu......
  • 链接服务器导致SQL Server停止响应
    概要如果多个实例中同时存在数据源为对方实例的链接服务器,并且开启了“分发服务器”的属性,您可能会遇到这种情况。1现象14:31时,在SSMS中检查HIS实例是否有复制订阅时,点击了”发布服务器属性“后,SSMS一直无法响应。     14:33时,前端应用反馈有连不上数据库的情况,用S......
  • GPS北斗卫星授时服务器是网络信息化时代的基石
    GPS北斗卫星授时服务器是网络信息化时代的基石GPS北斗卫星授时服务器是网络信息化时代的基石京准电子科技官微——ahjzsz时频,即时间和频率。我们每天看到的时间由高稳频率源产生和保持,频率的精度即决定了时间的精度。随着科学技术的进步,时间频率已经发展成为信息技术的重要支撑......
  • 会员权益-需求调查:需要什么样的云服务器优惠
    目前园子的会员权益少的可怜,但我们的目标是成为非常超值的会员。一边我们在努力开发产品增值功能,一边我们在寻找合作厂商,希望通过厂商的特殊优惠带给园子会员特别的实惠。现在是会员救园,但我们的目标是园惠会员。上周有一家云厂商专门赶到杭州云栖小镇与园子商谈合作,当知道我们正......
  • 【创新项目探索】大数据服务omnidata-hive-connector介绍
    omnidata-hive-connector介绍omnidata-hive-connector是一种将大数据组件Hive的算子下推到存储节点上的服务,从而实现近数据计算,减少网络带宽,提升Hive的查询性能。目前支持HiveonTez。omnidata-hive-connector已在openEuler社区开源。OmniData架构OmniData是算子下推的总称。Om......
  • Qt调用 mysql数据库 QSqlQuery::exec()堵塞
    RT,因为某个字段名称写错了,修改字段语句,语句大致如下altertablet_user_settingchangefield1field2varchar(32)default'11'comment'22'每当执行到query.exec()时,直接堵塞不动,刚好我这里使用workbench查看数据库,在workbench调用同样语句,程序就不堵塞了,每次都是这样。最......
  • SSH连接远程CENTENOS服务器报如下错误:Bad owner or permissions on。。。。
    由于使用git的缘故,导致WIN10----.ssh下面有了config文件,使得连接外部CENTENOS服务器报如下错误:Badownerorpermissionson。。。。最后的解决办法是找到.ssh文件夹,进行权限修改。可以参考这篇博文:Badownerorpermissionson.ssh/configwin10问题解决-Akkuman-博客园(......
  • 服务器DELL R710配置安装centos经验之谈
    怎么都没有办法引导U盘启动项或者光驱启动项。当时查了很多资料。竟然忘记修改boot选项了。一些老的系统默认为BIOS引导,一定要修改为UEFI引导。在BIOS里面设置修改。当时查了很多资料,怀疑可能和RAID有关。其实也没有什么关系的。我的服务器只有一个磁盘,当时各种配置都不好使。可......
  • vscode 中jupyter 远程连接服务器
    使用vscode的jupyter远程连接服务器,分为两部分:服务器端:安装jupyterjupyternotebook--generate-config生成默认配置文件/home/username/.jupyter/jupyter_notebook_config.py修改默认配置中如下两项:NotebookApp.allow_origin='*'NotebookApp.ip='0.0.0.0'jupyter......