热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

SpringCloud服务注册和消费实现过程

这篇文章主要介绍了SpringCloud服务注册和消费实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

系统架构

在没有微服务之前有已经有跨服务调用了,比如ServiceB去调用ServiceA中的服务 , 传统模式可以直接在ServiceB中写ServiceA中的服务但是这样是写死了的,不够灵活。

下图就是传统的调用


微服务下的跨系统调用应该是这样的:


此时服务的调用应该是分两个步骤的:
ServiceB 去服务中心拿到ServiceA的地址,如果ServiceA是单机部署,那么这个地址就只有一个,如果ServiceA是集群是集群环境部署,那么发现的地址就是多个。

拿到了ServiceA的地址后,ServiceB再去调用ServiceA的相关服务了。

这样做其实是有很多好处的,首先互相调用的地址可以不用写死,需要的时候直接去服务中心获取,并且服务之间也可以很方便的部署、集群等。

服务注册与消费搭建

1.首先我们创建一个ServiceRegister的普通maven项目,然后在创建一个Eureka的SpringBoot项目作为子项目


下面是Eureka项目的pom.xml 配置


    
      org.springframework.boot
      spring-boot-starter-web
    
    
      org.springframework.cloud
      spring-cloud-starter-netflix-eureka-server
    

    
      org.springframework.boot
      spring-boot-devtools
      runtime
      true
    
    
      org.springframework.boot
      spring-boot-starter-test
      test
    
  

  
    
      
        org.springframework.cloud
        spring-cloud-dependencies
        ${spring-cloud.version}
        pom
        import
      
    
  

下面是application.yml 配置文件

# 别名
spring:
 application:
  name: eureka
#端口
server:
 port: 1111

# eureka config
eureka:
 client:
  register-with-eureka: false
  fetch-registry: false

注意 这里配置好了后需要在Eureka这个子项目的启动类上加入下面这个注解

@EnableEurekaServer

这个注解的意义是代表这个项目成为一个注册中心

2.创建一个Provider

创建一个叫Provider的SpringBoot项目作为子项目,pom.xml配置


  Greenwich.SR1


  
    org.springframework.boot
    spring-boot-starter-web
  
  
    org.springframework.cloud
    spring-cloud-starter-netflix-eureka-client
  


  
    
      org.springframework.cloud
      spring-cloud-dependencies
      ${spring-cloud.version}
      pom
      import
    
  

下面是application.yml 配置文件

# 别名
spring:
 application:
  name: provider
#端口
server:
 port: 4001
# provider config
eureka:
 client:
  service-url:
   defaultZone: http://localhost:1111/eureka 

spring.application.name 是服务的名称,你可以理解成是别名,其他的服务调用的时候需要使用这个name来调用

server.port 是端口号

eureka.client.service-url.defaultZone 是这个服务需要注册到服务中心地址,这里需要注意的是,如果服务中心是一个集群,这里也可以只写服务中心的一个节点,eureka会自动集群对服务进行同步。

在微服务中,你的项目的pom.xml 中如果存在 spring-cloud-starter-netflix-eureka-client的依赖,并且提供了eureka注册中心的地址那么会默认注册到 Eureka Server 中。

然后我们在 provider 中提供一个简单的服务

@RestController
public class SayHelloController {
 @GetMapping("/sayHello")
 public String SayHello(String name) {
  return "sayHello" + name + "!";
 }
}

这样我们就创建好我们的服务提供者,并且提供了一个简单的服务接口了。

3.创建consumer

创建好了服务提供者,那么我们就来创建服务消费者consumer,创建一个SpringBoot的子项目工程 pom依赖如下


    
      org.springframework.boot
      spring-boot-starter-web
    
    
      org.springframework.cloud
      spring-cloud-starter-netflix-eureka-client
    

    
      org.springframework.boot
      spring-boot-starter-test
      test
    
  

  
    
      
        org.springframework.cloud
        spring-cloud-dependencies
        ${spring-cloud.version}
        pom
        import
      
    
  

这个配置和provider 配置几乎是一样的,下面是consumer的application.yml 配置文件

# 别名
spring:
 application:
  name: consumer
#端口
server:
 port: 4002
# provider config
eureka:
 client:
  service-url:
   defaultZone: http://localhost:1111/eureka 

唯一变了就是服务的名称。

配置好了后,我们在consumer的启动类中添加一个RestTemplate的实例,RestTemplate是Spring提供的一个Http请求工具,下面是这个RestTemplate实例的代码

@SpringBootApplication
public class ConsumerApplication {

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

  @Bean
  RestTemplate restTemplate() {
    return new RestTemplate();
  }
}

然后我们在consumer 中添加一个UserSayHelloController,在这里去调用provider 提供的服务。

@RestController
public class SayUserHelloController {
  @Autowired
  DiscoveryClient discoveryClient;
  @Autowired
  RestTemplate restTemplate;
  @GetMapping("/sayHello")
  public String hello(String name) {
    List list = discoveryClient.getInstances("provider");
    ServiceInstance instance = list.get(0);
    String host = instance.getHost();
    int port = instance.getPort();
    String s = restTemplate.getForObject("http://" + host + ":" + port + "/hello?name={1}", String.class, name);
    return s;
  }
}

上面代码的意思是解释如下:

首先我们在这个Controller中注入了一个DiscoveryClient ,DiscoveryClient可以从Eureka或者从Consul上根据服务名查询一个服务的详细信息,注意DiscoveryClient是下面这个包中的

org.springframework.cloud.client.discovery.DiscoveryClient
@Autowired
 RestTemplate restTemplate;

RestTemplate 就是Spring 给我们提供用来发送Http请求的,这个大多数人应该都是知道的。

List list = discoveryClient.getInstances("provider");

discoveryClient.getInstances 就是调用服务的名称,为什么用List去接受? 那是因为有可能provider 是单机部署 也有可能是集群部署,如果是集群部署的话,那么provider的实例就有多个

ServiceInstance 保存了provider 中 详细的信息、如主机地址、端口号、实例id等。ServiceInstance是一个接口,它有很多给实现类,我们本次的这个项目使用的是EurekaServiceInstance。

ServiceInstance instance = list.get(0);

因为我们只有一个provider 实例,所以我们就用list.get(0) 来获取实例了

获取主机地址

String host = instance.getHost();

获取端口号

int port = instance.getPort();

RestTemplate 的 getForObject 方法接收三个参数。第一个参数是请求地址,请求地址中的 {1} 表示一个参数占位符,第一个参数 String.class 表示返回的参数类型,第三个参数则是一个第一个占位符的具体值。

String s = restTemplate.getForObject("http://" + host + ":" + port + "/hello?name={1}", String.class, name);

最后我们返回这个s 就完成了consumer的编写

下面我们依次的启动Eureka(注册中心)和 服务提供者(provider) 以及 消费者(consumer)

然后在浏览器上输入:
localhost:4002/sayHello?name=jishu
结果如下图所示:

这样我们就顺利的从consumer 去调用了provider 的服务了

DiscoveryClient是哪里来的

归根结底 DiscoveryClient作用就是可以从Eureka 或者Consul 中查询服务的实例,不过DiscoveryClient就是一个接口而已,但是还是有一个实现类, 这个具体的实现类就是CompositeDiscovery,当我们的微服务启动的时候,就会在CompositeDiscoveryClientAutoConfiguration类中配置一个CompositeDiscovery的实例,下面这个就是大名鼎鼎的CompositeDiscoveryClientAutoConfiguration的源码

//这里就是DiscoveryClient的源码了
@Configuration
@AutoConfigureBefore(SimpleDiscoveryClientAutoConfiguration.class)
public class CompositeDiscoveryClientAutoConfiguration {

 //这里返回的是一个实例
	@Bean
	@Primary
	public CompositeDiscoveryClient compositeDiscoveryClient(
			List discoveryClients) {
		return new CompositeDiscoveryClient(discoveryClients);
	}

}

其实真正调用的是CompositeDiscoveryClient类中的discoveryClients 属性提供的 DiscoveryClient,而discoveryClients 属性默认集合中只有一条数据,就是EurekaDiscoveryClient,最终在EurekaDiscoveryClient类中,通过EurekaClient来获取一个微服务的实例信息了

总结

在不用微服务调用,服务之间的调用是相当繁琐的,并且地址是写死了,那么部署的话是非常的不方便,但是我们提供了注册中心的话,那么我们让服务注册到我们的注册中心中,然后在从注册中心去获取我们的服务信息,这样就有大大的好处,降低了调用的难度。

项目地址

github

到此这篇关于SpringCloud 服务注册和消费实现过程的文章就介绍到这了,更多相关SpringCloud 服务注册 消费内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之六 || API项目整体搭建 6.1 仓储模式
    代码已上传Github+Gitee,文末有地址  书接上文:前几回文章中,我们花了三天的时间简单了解了下接口文档Swagger框架,已经完全解放了我们的以前的Word说明文档,并且可以在线进行调 ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 学习笔记(34):第三阶段4.2.6:SpringCloud Config配置中心的应用与原理第三阶段4.2.6SpringCloud Config配置中心的应用与原理
    立即学习:https:edu.csdn.netcourseplay29983432482?utm_sourceblogtoedu配置中心得核心逻辑springcloudconfi ... [详细]
  • PreparedStatement防止SQL注入
    添加数据:packagecom.hyc.study03;importcom.hyc.study02.utils.JDBCUtils;importjava.sql ... [详细]
author-avatar
深碍是碍u不是爱
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有