首页 文章 精选 留言 我的

精选列表

搜索[系统],共10000篇文章
优秀的个人博客,低调大师

【阿里内部应用】基于Blink构建搜索全链路debug系统快速定位搜索问题

案例与解决方案汇总页:阿里云实时计算产品案例&解决方案汇总 一、背景介绍 以往在处理用户投诉或者开发过程中遇到的(特定商品在淘宝搜索中搜不到,排序靠后,价格不正确,打标不准,结果不准确等)问题或线上故障时,分析定位此类问题的过程非常繁琐: 根据用户或者搜索标识提交ODPS离线任务,捞取用户的搜索日志信息; 人工构造搜索串,重新请求引擎得到搜索复现数据; 解析复现数据,得到搜索结果列表,确认问题,分析debug trace信息,定位问题 以上调查过程存在诸多问题: 需要跑odps离线任务,消耗较多时间; 工作重复性很大,每当有类似问题出现时,都要走类似的调查流程,极大影响定位问题和解决问题的效率; 搜索实时个性化上线以后,搜索结果是千人千面的,并且相同用户在不同时刻的搜索结果也是变化的,这就导致简单通过请求的url来重现用户出问题的方

优秀的个人博客,低调大师

为自己搭建一个分布式 IM 系统二【从查找算法聊起】

前言 最近这段时间确实有点忙,这篇的目录还是在飞机上敲出来了的。 言归正传,上周更新了 cim 第一版;没想到反响热烈,最高时上了 GitHub Trending Java 版块的首位,一天收到了 300+ 的 star。 现在总共也有 1.3K+ 的 star,有几十个朋友参加了测试,非常感谢大家的支持。 在这过程中也收到一些 bug 反馈,feature 建议;因此这段时间我把一些影响较大的 bug 以及需求比较迫切的 feature 调整了,本次更新的 v1.0.1 版本: 客户端超时自动下线。 新增 AI 模式。 聊天记录查询。 在线用户前缀模糊匹配。 下面谈下几个比较重点的功能。 客户端超时自动下线 这个功能涉及到客户端和服务端的心跳设计,比较有意思,也踩了几个坑;所以准备留到下次单独来聊。 AI 模式 大家应该还记得这个之前刷爆朋友圈的 估值两个一个亿的 AI 核心代码。 和我这里的场景再合适不过了。 于是我新增了一个命令用于一键开启 AI 模式,使用情况大概如下。 欢迎大家更新源码体验,融资的请私聊我🤣。 聊天记录 聊天记录也是一个比较迫切的功能。 使用命令 :q 关键字 即可查询与个人相关的聊天记录。 这个功能其实比较简单,只需要在消息发送及接收消息时保存即可。 但要考虑的一点是,这个保存消息是 IO 操作,不可避免的会有耗时;需要尽量避免对消息发送、接收产生影响。 异步写入消息 因此我把消息写入的过程异步完成,可以不影响真正的业务。 实现起来也挺简单,就是一个典型的生产者消费者模式。 主线程收到消息之后直接写入队列,另外再有一个线程一直源源不断的从队列中取出数据后保存聊天记录。 大概的代码如下: 写入消息的同时会把消费消息的线程打开: 而最终存放消息记录的策略,考虑后还是以最简单的方式存放在客户端,可以降低复杂度。 简单来说就是根据当前日期+用户名写入到磁盘里。 当客户端关闭时利用线程中断的方式停止了消费队列的线程。 这点的设计其实和 logback 写日志的方式比较类似,感兴趣的可以去翻翻 logback 的源码,更加详细。 回调接口 至于收到其他客户端发来的消息时则是利用之前预留的消息回调接口来写入日志。 收到消息后会执行自定义的回调接口。 于是在这个回调方法中实现写入逻辑即可,当后续还有其他的消息处理逻辑时也能在这里直接添加。 当处理逻辑增多时最好是改为责任链模式,更加清晰易维护。 查找算法 接下来是本文着重要讨论的一个查找算法,准确的说是一个前缀模糊匹配的算法。 实现的效果如下: 使用命令 :qu prefix 可以按照前缀的方式搜索用户信息。 当然在命令行中其实意义不大,但是在移动端中确是比较有用的。类似于微信按照用户名匹配: 因为后期打算出一个移动端 APP,所以就先把这个功能实现了。 从效果也看得出来:就是按照输入的前缀匹配字符串(目前只支持英文)。 在没有任何限制的条件下最快、最简单的实现方式可以直接把所有的字符串存放在一个容器中 (List、Set),查询时则挨个遍历;利用 String.startsWith("prefix") 进行匹配。 但这样会有几个问题: 存储资源比较浪费,不管是 list 还是 Set 都会有额外的损耗。 查询效率较低,需要遍历集合后再遍历字符串的 char 数组(String.startsWith 的实现方式)。 字典树 基于以上的问题我们可以考虑下: 假设我需要存放 java,javascript,jsp,php 这些字符串时在 ArrayList 中会怎么存放? 很明显,会是这样完整的存放在一个数组中;同时这个数组还可能存在浪费,没有全部使用完。 但其实仔细观察这些数据会发现有一些共同特点,比如 java,javascript 有共同的前缀 java;和 jsp 有共同的前缀 j。 那是否可以把这些前缀利用起来呢?这样就可以少存储一份。 比如写入 java,javascript 这两个字符串时存放的结构如下: 当再存入一个 jsp 时: 最后再存入 jsf 时: 相信大家应该已经看明白了,按照这样的存储方式可以节省很多内存,同时查询效率也比较高。 比如查询以 jav 开头的数据,只需要从头结点 j 开始往下查询,最后会查询到 ava 以及 script 这两个个结点,所以整个查询路径所经历的字符拼起来就是查询到的结果java+javascript。 如果以 b 开头进行查询,那第一步就会直接返回,这样比在 list 中的效率高很多。 但这个图还不完善,因为不知道查询到啥时候算是匹配到了一个之前写入的字符串。 比如在上图中怎么知道 j+ava 是一个我们之前写入的 java 这个字符呢。 因此我们需要对这种是一个完整字符串的数据打上一个标记: 比如这样,我们将 ava、script、p、f 这几个节点都换一个颜色表示。表明查询到这个字符时就算是匹配到了一个结果。 而查到 s 这个字符颜色不对,代表还需要继续往下查。 比如输入关键字 js 进行匹配时,当它的查询路径走到 s 这里时判断到 s 的颜色不对,所以不会把 js 作为一个匹配结果。而是继续往下查,发现有两个子节点 p、f 颜色都正确,于是把查询的路径 jsp 和 jsf 都作为一个匹配结果。 而只输入 j,则会把下面所有有色的字符拼起来作为结果集合。 这其实就一个典型的字典树。 具体实现 下面则是具体的代码实现,其实算法不像是实现一个业务功能这样好用文字分析;具体还是看源码多调试就明白了。 谈下几个重点的地方吧: 字典树的节点实现,其中的 isEnd 相当于图中的上色。 利用一个 Node[] children 来存放子节点。 为了可以区分大小写查询,所以子节点的长度相当于是 26*2。 写入数据 这里以一个单测为例,写入了三个字符串,那最终形成的数据结构如下: 图中有与上图有几点不同: 每个节点都是一个字符,这样树的高度最高为52。 每个节点的子节点都是长度为 52 的数组;所以可以利用数组的下标表示他代表的字符值。比如 0 就是大 A,26 则是小 a,以此类推。 有点类似于之前提到的布隆过滤器,可以节省内存。 debug 时也能看出符合上图的数据结构: 所以真正的写入步骤如下: 把字符串拆分为 char 数组,并判断大小写计算它所存放在数组中的位置 index。 将当前节点的子节点数组的 index 处新增一个节点。 如果是最后一个字符就将新增的节点置为最后一个节点,也就是上文的改变节点颜色。 最后将当前节点指向下一个节点方便继续写入。 查询总的来说要麻烦一些,其实就是对树进行深度遍历;最终的思想看图就能明白。 所以在 cim 中进行模糊匹配时就用到了这个结构。 字典树的源码在此处: https://github.com/crossoverJie/cim/blob/master/cim-common/src/main/java/com/crossoverjie/cim/common/data/construct/TrieTree.java 其实利用这个结构还能实现判断某个前缀的单词是否在某堆数据里、某个前缀的单词出现的次数等。 总结 目前 cim 还在火热内测中(虽然群里只有20几人),感兴趣的朋友可以私聊我拉你入伙☺️ 再没有新的 BUG 产生前会着重把这些功能完成了,不出意外下周更新 cim 的心跳重连等机制。 完整源码: https://github.com/crossoverJie/cim 如果这篇对你有所帮助还请不吝转发。

优秀的个人博客,低调大师

第一篇:SpringCloud 构建微服务系统之服务注册和发现(consul)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/85260629 今天我们要学习的是consul在soringcloud中的使用。首先学习consul之前,我们应该看看consul的官网,对它有一个初步的认识。 1. consul 官网 (https://www.consul.io) 2. consul 简介 consul是google开源的一个使用go语言开发的服务发现、配置管理中心服务。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。服务部署简单,只有一个可运行的二进制的包。每个节点都需要运行agent,他有两种运行模式server和client。每个数据中心官方建议需要3或5个server节点以保证数据安全,同时保证server-leader的选举能够正确的进行。 3.consul基本概念 client CLIENT表示consul的client模式,就是客户端模式。是consul节点的一种模式,这种模式下,所有注册到当前节点的服务会被转发到SERVER,本身是不持久化这些信息。 server SERVER表示consul的server模式,表明这个consul是个server,这种模式下,功能和CLIENT都一样,唯一不同的是,它会把所有的信息持久化的本地,这样遇到故障,信息是可以被保留的。 server-leader 中间那个SERVER下面有LEADER的字眼,表明这个SERVER是它们的老大,它和其它SERVER不一样的一点是,它需要负责同步注册的信息给其它的SERVER,同时也要负责各个节点的健康监测。 raft server节点之间的数据一致性保证,一致性协议使用的是raft,而zookeeper用的paxos,etcd采用的也是taft。 服务发现协议 consul采用http和dns协议,etcd只支持http 服务注册 consul支持两种方式实现服务注册,一种是通过consul的服务注册http API,由服务自己调用API实现注册,另一种方式是通过json个是的配置文件实现注册,将需要注册的服务以json格式的配置文件给出。consul官方建议使用第二种方式。 服务发现 consul支持两种方式实现服务发现,一种是通过http API来查询有哪些服务,另外一种是通过consul agent 自带的DNS(8600端口),域名是以NAME.service.consul的形式给出,NAME即在定义的服务配置文件中,服务的名称。DNS方式可以通过check的方式检查服务。 服务间的通信协议 Consul使用gossip协议管理成员关系、广播消息到整个集群,他有两个gossip pool(LAN pool和WAN pool),LAN pool是同一个数据中心内部通信的,WAN pool是多个数据中心通信的,LAN pool有多个,WAN pool只有一个。 4.consul架构图 5.Consul常用命令 5.1 agent 运行一个consul agent consul agent -dev 5.2 join 将agent加入到consul集群 consul join IP 5.3 members 列出consul cluster的members consul members 5.4 leave 将节点移除所在集群 consul leave 6.consul安装和启动 点击“download”下载:使用命令启动 consul agent -dev 启动成功之后在地址:http://localhost:8500 7.consul服务的发现与注册 7.1 注册服务 使用HTTP API 注册个服务,使用[接口API](https://www.consul.io/api/agent/service.html API)调用 调用 http://localhost:8500/v1/agent/service/register PUT 注册一个服务。request body: { "ID": "userServiceId", //服务id "Name": "userService", //服务名 "Tags": [ //服务的tag,自定义,可以根据这个tag来区分同一个服务名的服务 "primary", "v1" ], "Address": "127.0.0.1",//服务注册到consul的IP,服务发现,发现的就是这个IP "Port": 9000, //服务注册consul的PORT,发现的就是这个PORT "EnableTagOverride": false, "Check": { //健康检查部分 "DeregisterCriticalServiceAfter": "90m", "HTTP": "http://www.baidu.com", //指定健康检查的URL,调用后只要返回20X,consul都认为是健康的 "Interval": "10s" //健康检查间隔时间,每隔10s,调用一次上面的URL } } 使用curl调用 curl http://127.0.0.1:8500/v1/agent/service/register -X PUT -i -H "Content-Type:application/json" -d '{ "ID": "userServiceId", "Name": "userService", "Tags": [ "primary", "v1" ], "Address": "127.0.0.1", "Port": 8000, "EnableTagOverride": false, "Check": { "DeregisterCriticalServiceAfter": "90m", "HTTP": "http://www.baidu.com", "Interval": "10s" } }' 结果 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 288 0 0 100 288 0 18000 --:--:-- --:--:-- --:--:-- 18000HTTP/1.1 200 OK Vary: Accept-Encoding Date: Wed, 26 Dec 2018 05:11:32 GMT Content-Length: 0 7.2 发现个服务 刚刚注册了名为userService的服务,我们现在发现(查询)下这个服务 curl http://127.0.0.1:8500/v1/catalog/service/userService 返回的响应: curl http://127.0.0.1:8500/v1/catalog/service/userService % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 891 100 891 0 0 28741 0 --:--:-- --:--:-- --:--:-- 28741[ { "ID": "9b831a00-ae68-d575-5e51-df193897b834", "Node": "vip-PC", "Address": "127.0.0.1", "Datacenter": "dc1", "TaggedAddresses": { "lan": "127.0.0.1", "wan": "127.0.0.1" }, "NodeMeta": { "consul-network-segment": "" }, "ServiceKind": "", "ServiceID": "userServiceId", "ServiceName": "userService", "ServiceTags": [ "primary", "v1" ], "ServiceAddress": "127.0.0.1", "ServiceWeights": { "Passing": 1, "Warning": 1 }, "ServiceMeta": {}, "ServicePort": 8000, "ServiceEnableTagOverride": false, "ServiceProxyDestination": "", "ServiceProxy": {}, "ServiceConnect": {}, "CreateIndex": 88, "ModifyIndex": 88 } ] 基本的服务发现和注册我们已经弄清楚了。接下来我来看看Spring Cloud 整合consul的使用。 8. consul服务提供者 8.1创建一个项目:spring-cloud-consul-provider 引入依赖 <?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"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.lidong</groupId> <artifactId>spring-cloud-consul-producer</artifactId> <version>1.0.0</version> <name>spring-cloud-consul-producer</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.RC2</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> </repository> </repositories> </project> 对配置文件做一个简单的介绍,我们使用的是最新版的springboot2.1.1,springcloud.Greenwich.RC2版本。 其中: spring-boot-starter-actuator 健康检查依赖于此包。 spring-cloud-starter-consul-discovery Spring Cloud consul的服务发现支持。 8.2 提供者添加配置(application.yml) server: port: 9001 #提供者的端口 spring: application: name: spring-cloud-consul-producer cloud: consul: host: localhost port: 8500 discovery: tags: dev serviceName: spring-cloud-consul-producer # 注册到consul的服务名称 healthCheckPath: /actuator/health healthCheckInterval: 15s healthCheckUrl: http://127.0.0.1:9001/actuator/health register: true prefer-ip-address: false consul的地址和端口号默认是127.0.0.1:8500,如果没有配置hosts,默认的地址localhost,consul服务会占用8500端口 server.port :9001 服务的提供者的端口spring.application.name 是指注册到 consul的服务名称,后期客户端会根据这个名称来进行服务调用。 spring.application.cloud.discovery.discovery.host: localhost spring.application.cloud.discovery.discovery. port:8500 8.3 修改启动类 添加 @EnableDiscoveryClient 注解,开启服务发现支持。 package com.lidong.provider; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * 开启服务发现 */ @EnableDiscoveryClient @SpringBootApplication public class SpringCloudLidongProviderApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudLidongProviderApplication.class, args); } } 8.4新建服务 新建 ConsulProducerController,提供 sayHello 接口, 返回一个hello—>字符串。 package com.lidong.provider.service; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * 创建服务 */ @RestController public class ConsulProducerController { @Value("${server.port}") private Integer port; /** * 服务接口 * @param name * @return */ @RequestMapping("/hello") public String sayHello(@RequestParam("name")String name) { return "hello ---> "+name+" port -->"+port; } } 启动项目: 2018-12-26 13:21:42.984 INFO 20248 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9001 (http) with context path '' 2018-12-26 13:21:42.994 INFO 20248 --- [ main] o.s.c.c.s.ConsulServiceRegistry : Registering service with consul: NewService{id='spring-cloud-consul-producer-9001', name='spring-cloud-consul-producer', tags=[dev, secure=false], address='vip-PC', meta=null, port=9001, enableTagOverride=null, check=Check{script='null', interval='15s', ttl='null', http='http://127.0.0.1:9001/actuator/health', method='null', header={}, tcp='null', timeout='null', deregisterCriticalServiceAfter='null', tlsSkipVerify=null, status='null'}, checks=null} 2018-12-26 13:21:43.008 INFO 20248 --- [ main] l.p.SpringCloudLidongProviderApplication : Started SpringCloudLidongProviderApplication in 4.09 seconds (JVM running for 4.755) 服务提供者发布成功。 这时候,我们在控制台会发现服务列表中有一个名字为spring-cloud-consul-producer的服务 点击详情会发现服务的详细信息 9. Consul服务消费者 9.1创建一个项目:spring-cloud-consul-consumer 引入依赖 <?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"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.lidong</groupId> <artifactId>spring-cloud-consul-consumer</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-cloud-consul-consumer</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.RC2</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</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>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> </repository> </repositories> </project> 9.2 消费者添加配置(application.yml) server: port: 9002 #服务消费者的端口 spring: application: name: spring-cloud-consul-consumer cloud: consul: host: localhost port: 8500 discovery: tags: dev register: false #设置不需要注册到 consul 中 healthCheckPath: /actuator/health healthCheckInterval: 15s healthCheckUrl: http://127.0.0.1:9002/actuator/health consul的地址和端口号默认是 127.0.0.1:8500,如果没有配置hosts,默认的地址localhost,consul服务会占用8500接口 server.port :9006 服务的消费者的端口 spring.application.cloud.consul.discovery.register: false 9.3配置启动类 package com.lidong.consumer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.client.RestTemplate; @SpringBootApplication @EnableDiscoveryClient public class SpringCloudConsulConsumerApplication { @Autowired private RestTemplateBuilder builder; @LoadBalanced @Bean// 添加负载均衡支持,很简单,只需要在RestTemplate上添加@LoadBalanced注解,那么RestTemplate即具有负载均衡的功能,如果不加@LoadBalanced注解的话,会报java.net.UnknownHostException:springboot-h2异常,此时无法通过注册到Eureka Server上的服务名来调用服务,因为RestTemplate是无法从服务名映射到ip:port的,映射的功能是由LoadBalancerClient来实现的。 public RestTemplate restTemplate() { return builder.build(); } public static void main(String[] args) { SpringApplication.run(SpringCloudConsulConsumerApplication.class, args); } } 9.4创建消费服务 package com.lidong.consumer.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; /** * 创建服务的消费者 */ @RestController public class ConsumerController { private static final String SERVICE_NAME = "spring-cloud-consul-producer"; @Autowired private DiscoveryClient discoveryClient; /** * 获取所有服务 */ @RequestMapping("/services") public Object services() { return discoveryClient.getInstances(SERVICE_NAME); } /** * 消费服务 */ @RequestMapping("/callSayHello") public String services(@RequestParam("name") String name) { ServiceInstance serviceInstance = (ServiceInstance) discoveryClient.getInstances(SERVICE_NAME); String callServiceResult = new RestTemplate().getForObject(serviceInstance.getUri().toString() + "/hello", String.class); System.out.println(callServiceResult); return callServiceResult; } } http://localhost:9002/services 获取服务列表的结果 [{"instanceId":"spring-cloud-consul-producer-9001","serviceId":"spring-cloud-consul-producer","host":"vip-PC","port":9001,"secure":false,"metadata":{"dev":"dev","secure":"false"},"uri":"http://vip-PC:9001","scheme":null}] 测试请求的urlhttp://localhost:9002/callSayHello?name=9002 消费的结果 hello ---> 9002 port -->9001 源码地址https://download.csdn.net/download/u010046908/10877868

优秀的个人博客,低调大师

java B2B2C Springboot多租户电子商城系统-Consul 介绍

1、Consul 是什么愿意了解源码的朋友直接企鹅求求:二一四七七七五六三三Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,采用 Go 语言开发。Consul 支持健康检查,并允许 HTTP 和 DNS 协议调用 API 存储键值对。Consul 采用 Raft 一致性协议算法,来保证服务的高可用;使用 GOSSIP 协议管理成员和广播消息,并且支持 ACL 访问控制。 2、Consul 的使用场景Docker 实例的注册与配置共享与 Consul template 服务集成,动态生成 Nginx 和 HAProxy 等配置文件Spring-Cloud-Consul 服务发现和配置文件存储 3、Consul 的优势使用 Raft 算法来保证一致性, 比 ZooKeeper 的 Paxos 算法更简单直接。支持多数据中心,内外网的服务采用不同的端口进行监听。 ZooKeeper 和 etcd 均不提供多数据中心功能的支持。支持健康检查,etcd 不提供此功能。支持 http 和 dns 协议接口。ZooKeeper 的集成较为复杂,etcd 只支持 http 协议。官方提供 web 管理界面,etcd 无此功能。Consul 1.2 新增 Service Mesh 解决方案。 4、Consul、ZooKeeper、etcd、Eureka 比较代码结构图:资料和源码来源

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册