前言

服务注册与发现的学习。这个其实是微服务的核心了,因为微服务的一个重要理念就是将项目拆分,达到解耦的地步。那么如何把这些服务联系到一起就很关键。

如果一个服务到另外一个服务通过ip地址之间访问,虽然说没有物理层面的耦合,但是呢,这里面有网络层面的耦合。

比如说一家公司有一个软件,那么这个软件里面有一个企业版,这个企业版是部署到客户那里的话,那么代码就得修改,因为代码里面其实有网络耦合,那么这个这样不仅要另外创建一个分支去修改代码,而且维护相当麻烦。

那么怎么弄呢?才能解决代码层面的网络耦合,这时候服务注册与发现就起到了作用。那么问题就来了,那么我如何知道去访问哪个地址?或者说服务地址如何变成动态的,对吧。

那么这个时候就需要建立另外一个服务,那就是注册与发现服务了。这里其实看一下就好,这里我们自己搭建这个服务,在线上k8服务中,其实是有一套自己的服务注册与发现。

用里面的一句话说就是:

在传统的rpc远程调用框架中(remote precedure call【远程调用】 这里补充说一下,这里的rpc 不是说是直接http这种调用方式,具体的后面会补充一张rpc,然后和这种注册与发现对比,就有一些鲜明的地方),管理每个服务与服务之间的依赖关系比较复杂,

所以就需要管理服务与服务之间的关系,就有了这个服务注册与发现,其实就是服务管理。

这里主要看下具体的概念和思路。

正文

放一下图形:

这里我们看到服务与服务之间还是通过这种远程调用的方式来实现,但是呢,就是说这个service Consumer去访问服务的地址是动态的。

service Provider 会在eureka 中进行注册登记,然后这个service Consumer 会在这个eureka中服务进行subscribe, euraka 会进行通知更新服务地址从而达到解耦的地步。所以说微服务的确会消耗更多的资源。

他们的注册方式是通过http这种无状态的服务,但是当他们注册后呢,会进行心跳检测,进行一个长链接,来确定服务是否存活。

建立一个module,这里引用eureka这个服务组件。

上面

pom 如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>zhifu</artifactId>
<groupId>org.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion> <artifactId>cloud-eureka-server7001</artifactId>
<dependencies>
<!--eureka server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--引入公共的Entity-->
<dependency>
<groupId>org.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<!--boot web actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--一般通用配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>

上面都做了标注,这里就不过多的解释问题了。就是引用如eureka。

然后就是对eureka进行一个配置,配置文件如下:

server:
port: 7001
eureka:
instance:
hostname: localhost #eureka服务端的实例名称
client:
#false表示不向注册中心注册自己
register-with-eureka: false
#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: false
service-url:
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZ4 one: http://${eureka.instance.hostname}:${server.port}/eureka/

接下来就是main启动类的构建:

package com.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7001.class,args);
}
}

然后访问localhost:7001,然后就可以看到注册界面了。

上面我们可以看到是没有服务的,那么现在就需要注册前面的支付服务到里面去。

在支付服务中,添加依赖:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

然后加上eureka 客户端的配置:

eureka:
client:
#表示是否将自己注册进EurekaServer默认为true
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka

加上声明:

@EnableEurekaClient
public class PaymentMain8001 {

那么经过这些配置后,我们启动,看下eureka的服务列表有什么变化吗?

这里我们的服务就发生了变化,那么现在就是一个ok的状态了。

下面的问题就是一个服务的调用过程了。同样,service Consumer同样需要去做出订阅。

订单微服务配置如下:

<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

同样进行一个注册进服务中去:

eureka:
client:
#表示是否将自己注册进EurekaServer默认为true
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka

当然我们要启动eureka。

在启动项上加上:

@EnableEurekaClient
public class OrderMain80 {

然后再看下变化:

两个服务都已经注册进去了,那么接下来就是就是服务之间的调用了。

这个怎么调用呢?通过服务域名。

把访问地址换成服务名:

public class OrderController {
private static final String PAYMENT_URL = "http://cloud-provider-service"; @Resource
private RestTemplate restTemplate; @PostMapping("/consumer/payment/create")
public CommonResult<Payment> create(Payment payment){
return restTemplate.postForObject(PAYMENT_URL+"/payment/create",payment,CommonResult.class);
} @GetMapping("/consumer/payment/get/{id}")
public CommonResult<Payment> getPayment(@PathVariable("id") Long id){
return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
}
}

"message": "I/O error on GET request for "http://cloud-provider-service/payment/get/3": cloud-provider-service; nested exception is java.net.UnknownHostException: cloud-provider-service"

然后就报错了,这里写的是不知名的host cloud-provider-service。

那么如何让我们正确去解析到呢?通过:



这里面还有均衡负载的功能,后面我们通过集群来了解。

然后访问一下就正常了。

好吧,这样就可以访问了,那么问题来了,如何实现高可用呢?

最简单的方式就是集群,这里两个地方是需要集群的,第一个是eureka还有一个是service provider。

eureka 集群:

创建module cloud-eureka-server7002

和7001配置一样。

然后再host 中加入:

127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com

然后分别修改一下他们的配置:

然后重新启动一下,这两个东西。

然后

这样他们就形成了相互守望的情况。这个DS Replicas 表示的是同步给哪台机器的意思。

然后我们可以在支付和订单模块中修改配置:

service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

对了,如果想测试是否集群了,defaultZone可以只填写一个,比如说 http://eureka7001.com:7001/eureka,看下另外一个http://eureka7002.com:7002/eureka是否同步了。

那么现在注册订阅服务集群了,那么下面就看下service provider 如何集群吧,这里的service provider 特指支付模块。

建立module cloud-provider-payment8002,和cloud-provider-payment8001一样。

这里模拟我们生产环境中的docker。

我们只需要把原来的端口8001改成8002即可。

这样其实我们就已经集群了。

看到下面有两个:

在我们前面增加了这个LoadBalanced,那么我们的订单服务会根据获取的服务集群均衡负载。

为了方便颜色,把8001和8002返回的结果变动一下。

会根据当前不同的端口,返回不同的信息。

同样调用端口,第一次:

第二次:

然后反复的8001和8002这样下去。

下面一章介绍如何自定义均衡负载方式。

spring cloud 学习笔记 服务注册与发现(二)的更多相关文章

  1. spring cloud 学习之 服务注册和发现(Eureka)

    一:服务注册和发现(Eureka) 1:采用Eureka作为服务注册和发现组件 2:Eureka 项目中 主要在启动类加上 注解@EnableEurekaServer @SpringBootAppli ...

  2. Spring Cloud Alibaba | Nacos服务注册与发现

    目录 Spring Cloud Alibaba | Nacos服务注册与发现 1. 服务提供者 1.1 pom.xml项目依赖 1.2 配置文件application.yml 1.3 启动类Produ ...

  3. Spring Cloud Consul 实现服务注册和发现

    Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具,它为基于 JVM 的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布 ...

  4. 服务注册发现Eureka之一:Spring Cloud Eureka的服务注册与发现

    Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁 ...

  5. Spring Cloud Consul使用——服务注册与发现(注册中心)

    整理自该文章 一.Consul 服务端接下来我们开发 Consul 的服务端,创建一个 spring-cloud-consul-producer 项目 1.添加依赖包 <dependencies ...

  6. Spring Cloud实践之服务注册与发现Eureka

    一.简述: 服务提供者producer与服务消费者consumer都注册到eureka server,然后服务consumer在其应用内直接调用producer的服务名来调用服务,而不是像之前一样调用 ...

  7. Spring Cloud Eureka 实现服务注册与发现

    微服务 是一种架构模式,跟具体的语言实现无关,微服务架构将业务逻辑分散到了各个服务当中,服务间通过网络层进行通信共同协作:这样一个应用就可以划分为多个服务单独来维护发布.构建一个可靠微服务系统是需要具 ...

  8. Spring Cloud之Eureka服务注册与发现

    解决什么问题 ➟阐述微服务以及服务注册发现的部分概念 ➟阐述Eureka服务注册与发现的部分原理及细节 为什么需要服务中心 过去,每个应用都是一个CPU,一个主机上的单一系统.然而今天,随着大数据和云 ...

  9. Spring Cloud(一):服务注册与发现

    Spring Cloud是什么 Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均 ...

  10. Spring Cloud Alibaba 的服务注册与发现

    Spring Cloud Alibaba 服务发现例子 一.需求 1.提供者完成的功能 2.消费者完成的功能 3.可以附加的额外配置 二.实现步骤 1.总的依赖引入 2.服务提供者和发现者,引入服务发 ...

随机推荐

  1. 迈向现代化的.NET配置指北

    一.欢呼 .NET Standard 时代   我现在已不大提 .NET Core,对于我来说,未来的开发将是基于 .NET Standard,不仅仅是面向未来 ,也是面向过去:不只是 .NET Co ...

  2. RC4Drop算法的工作原理揭秘:加密技术的进步之路

    RC4Drop算法起源: RC4Drop算法是RC4算法的一种改进版本,旨在解决RC4算法在长时间加密过程中可能出现的密钥流偏置问题.RC4算法由Ron Rivest于1987年设计,是一种流密码算法 ...

  3. [已读带总结] Effective JavaScript 编写高质量JavaScript代码的68个有效方法

    目录 电子书下载:https://www.jb51.net/books/328297.html 第2章 第11条 熟练掌握闭包 https://www.cnblogs.com/wengxuesong/ ...

  4. Nginx 同时支持 http 和 https SSL 为了能有权限调取摄像头

    Nginx 同时支持 http 和 https 当然起项目的会后也分成俩 "dev": "vue-cli-service serve --port=8080", ...

  5. WEBRTC回声消除-AECM算法源码解析之参数解析

    一 概述   webrtc 针对回声问题一共开源了3种回声消除算法,分别为aec,aecm,以及aec3,其中aec是最早期的版本,在后续的更新中aec3的出现代替了aec在webrtc 中的地位,而 ...

  6. Nordic芯片调研简析

    一 公司简介: Nordic semiconductor是一家在奥斯证券交易所(OSX:NOD)上市的挪威无晶圆厂半导体公司,专门研究IoT的无线技术.Nordic的声誉建立在领先的技术和开发工具之上 ...

  7. 快速将json装DTO的GsonFormatPlus插件使用

    参考:https://www.jianshu.com/p/8fb0e4274436 https://blog.csdn.net/qq_43039260/article/details/12676582 ...

  8. MapStructPlus 1.4.0 发布,体积更轻量!性能更强!

    MapStruct Plus 是 MapStruct 的增强工具,在 Mapstruct 的基础上,实现了自动生成 Mapper 接口的功能,并强化了部分功能,使 Java 类型转换更加便捷.优雅. ...

  9. Error: Command failed: C:\windows\system32\cmd.exe /s /c "./configure --disable-shared

    错误记录之: Error: Command failed: C:\windows\system32\cmd.exe /s /c "./configure --disable-shared 错 ...

  10. 记录--你敢信?比 setTimeout 还快 80 倍的定时器

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 起因 很多人都知道,setTimeout是有最小延迟时间的,根据MDN 文档 setTimeout:实际延时比设定值更久的原因:最小延迟时 ...