如何设计一个注册中心?(2)实现注册接口

1. 创建SpringBoot工程

创建父工程及三个子模块,其中一个模块作为注册中心,另外两个作为服务提供者。
在这里插入图片描述
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"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>registerTest</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version><modules><module>server</module><module>provider1</module><module>provider2</module></modules><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.1.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.1.23</version></dependency></dependencies></project>

2. 实现http访问

注意:这里目前用的是同步请求,实际用异步才是合适的

package http.client;import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;public class HttpClient {private String url;private String contentType;private String encoding;private JSONObject data;public HttpClient(String url, String encoding, String contentType, JSONObject data) {this.url = url;this.data = data;this.encoding = encoding == null ? "UTF-8" : encoding;this.contentType = contentType == null ? "application/json" : contentType;}public JSONObject httpGet() throws Exception {try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {HttpGet httpGet = new HttpGet(url);HttpResponse response = httpClient.execute(httpGet);if (response.getStatusLine().getStatusCode() != 200) {
//            throw new Exception("调用服务端异常.");return getResult(false, "调用服务端异常.");}HttpEntity res = response.getEntity();String resultData = EntityUtils.toString(res);System.out.println("从服务端返回结果: " + resultData);return JSONObject.parseObject(resultData);} catch (Exception e) {e.printStackTrace();}return getResult(false, "");}public JSONObject httpPost() throws Exception {try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {String json = JSONObject.toJSONString(data);StringEntity entity = new StringEntity(json);entity.setContentEncoding(encoding);entity.setContentType(contentType);HttpPost httpPost = new HttpPost(url);httpPost.setEntity(entity);HttpResponse response = httpClient.execute(httpPost);if (response.getStatusLine().getStatusCode() != 200) {return getResult(false, "调用服务端异常.");}HttpEntity res = response.getEntity();String resultData = EntityUtils.toString(res);System.out.println("从服务端返回结果: " + resultData);} catch (Exception e) {e.printStackTrace();}return getResult(false, "");}public static JSONObject getResult(boolean res, String msg) {return new JSONObject(){{put("res", res);put("msg", msg);}};}
}

实现一个简单的注册表结构,代表模块的名称和ip

package common;public class RegisterTable {private String name;private String ip;public RegisterTable(String name, String ip) {this.name = name;this.ip = ip;}public String getIp() {return ip;}
}

3. 注册中心实现

实现注册表管理,增加,删除,查询

package register.list;import com.alibaba.fastjson.JSONObject;
import common.RegisterTable;
import http.client.HttpClient;
import org.springframework.stereotype.Component;import java.util.ArrayList;
import java.util.HashMap;@Component
public class RegisterList {HashMap<String, ArrayList<RegisterTable>> hashMap = new HashMap<>();public JSONObject add(String name, String ip) {ArrayList<RegisterTable> list = hashMap.get(name);if (list == null) {list = new ArrayList<RegisterTable>();} else {for (RegisterTable table : list) {if (table.getIp().equals(ip)) {return HttpClient.getResult(false, "repeat");}}}RegisterTable registerTable = new RegisterTable(name,ip);list.add(registerTable);hashMap.put(name, list);return HttpClient.getResult(true, "success");}public HashMap<String, ArrayList<RegisterTable>> getAll() {return hashMap;}public ArrayList<RegisterTable> getByName(String name) {return hashMap.get(name);}
}

提供注册接口:

package register.control;import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import register.list.RegisterList;@RestController
@RequestMapping("/register")
public class Register {@AutowiredRegisterList registerList;@PostMapping("/register")public JSONObject register(@RequestBody JSONObject data) {//处理注册逻辑return registerList.add(data.getString("name"), data.getString("ip"));}@GetMapping("/list/{name}")public Object getList(@PathVariable(value = "name", required = true) String name) {//获取注册列表return registerList.getByName(name);}@GetMapping("/list/all")public Object getList() {return registerList.getAll();}
}

4. provider模块

功能:项目启动后发送注册信息到注册中心模块。

package common.register;import com.alibaba.fastjson.JSONObject;
import http.client.HttpClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;@Component
public class Register implements ApplicationRunner {@Value("${model.name}")String name;@Value("${model.host}")String host;@Value("${model.port}")String port;@Value("${register.url}")String url;//发送注册消息@Overridepublic void run(ApplicationArguments args) throws Exception {register();}private void register() throws Exception {JSONObject data = new JSONObject() {{put("name", name);put("ip", "http://" + host + ":" + port);}};HttpClient client = new HttpClient(url, null, null, data);client.httpPost();}
}

application.yml

server:port: 8001model:name: "provider"port: "8001"host: "127.0.0.1"register:url: "http://localhost:8080/register/register"

另外一个provider也是一样,不过端口不同

5. 测试

启动后:
在这里插入图片描述
查询注册表:两个模块都已经注册。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/26531.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytorch保存、加载和解析模型权重

1、模型保存和加载 主要有两种情况&#xff1a;一是仅保存参数&#xff0c;二是保存参数及模型结构。 保存参数&#xff1a; torch.save(net.state_dict()) 加载参数&#xff08;加载参数前需要先实例化模型&#xff09;&#xff1a; param torch.load(param.pth) net.load_…

2023最新版本Activiti7系列-身份服务

身份服务 在流程定义中在任务结点的 assignee 固定设置任务负责人&#xff0c;在流程定义时将参与者固定设置在.bpmn 文件中&#xff0c;如果临时任务负责人变更则需要修改流程定义&#xff0c;系统可扩展性差。针对这种情况可以给任务设置多个候选人或者候选人组&#xff0c;可…

vue-next-admin vue3.x版本,table自定义

vue3.x版本&#xff0c;将table进行了封装。使用起来更方便了。但是&#xff0c;有时候我们需要将一组信息显示到一列中。所以我将其进行了简单的二次改造。支持table-column自定义。 table改造代码 <template><div class"table-container"><el-tabl…

【Ajax】笔记-POST请求(原生)

POST请求 html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>AJAX POST 请求</title><…

VScode——NPM脚本窗口找不到

一、问题描述&#xff08;NPM终端在任务栏左侧找不到&#xff09; VScode&#xff08;Visual Studio Code&#xff09;版本&#xff1a;1.79.2 二、解决办法 第一步&#xff1a;通过设置/用户设置/扩展/MPM更改NPM默认配置&#xff0c;如下图所示&#xff1a; 第二步&#xff…

springboot实现全局异常捕获

导言&#xff1a; 为什么要做异常处理&#xff1a; 原因有三&#xff1a; 1、将系统产生的全部异常统一捕获处理。 2、自定义异常需要由全局异常来捕获。 3、JSR303规范的validator参数校验器、参数校验不通过、本身无法使用try…catch 其实对于前后端分离的项目做异常处理…

分布式应用之Zookeeper和Kafka

分布式应用之Zookeeper和Kafka 一、Zookeeper 1.定义 分布式系统管理框架&#xff0c;主要用来解决分布式集群中应用系统的一致性问题 相当于各种分布式应用服务的 注册中心 文件系统 通知机制2.特点 &#xff08;1&#xff09;Zookeeper&#xff1a;一个领导者&#…

【Java基础教程】(十五)面向对象篇 · 第九讲:抽象类和接口——定义、限制与应用的细节,初窥模板设计模式、工厂设计模式与代理设计模式~

Java基础教程之面向对象 第九讲 本节学习目标1️⃣ 抽象类1.1 抽象类定义1.2 抽象类的相关限制1.3 抽象类应用——模板设计模式 2️⃣ 接口2.1 接口定义2.2 接口的应用——标准2.3 接口的应用——工厂设计模式 (Factory)2.4 接口的应用——代理设计模式 (Proxy) 3️⃣ 抽象类与…

数据库的扩展策略

了解不同的数据库扩展技术可以帮助我们选择适合我们需求和目的的合适策略。 因此&#xff0c;在本文中&#xff0c;我们将展示不同的解决方案和技术&#xff0c;用于扩展数据库服务器。它们分为读取和写入策略。 读取/加载 有时我们的应用程序承受着巨大的负载。为了解决这个…

【VSCode | 使用技巧集锦】中文插件突然失效、配置单个工程(工作区)编码

目录 ✨技巧一&#xff1a;中文插件失效的解决办法✨技巧二&#xff1a;配置单个工程(工作区)编码 ✨技巧一&#xff1a;中文插件失效的解决办法 问题描述&#xff1a;VSCode之前安装了中文插件&#xff0c;可以正常汉化&#xff0c;用了一段时间都没问题&#xff0c;今天打开v…

51单片机的智能交通控制系统【含仿真+程序+演示视频带原理讲解】

51单片机的智能交通控制系统【含仿真程序演示视频带原理讲解】 1、系统概述2、核心功能3、仿真运行及功能演示4、程序代码 1、系统概述 该系统由AT89C51单片机、LED灯组、数码管组成。通过Protues对十字路口红绿灯控制逻辑进行了仿真。 每个路口包含了左转、右转、直行三条车道…

【UE4 塔防游戏系列】08-敌人到达终点对玩家造成伤害

目录 效果 步骤 一、敌人到终点时扣除玩家生命值 二、显示玩家生命值 效果 可以看到敌人进入终点后&#xff0c;左上角的玩家生命值会减少。 步骤 一、敌人到终点时扣除玩家生命值 新建一个Actor蓝图类&#xff0c;命名为“BP_EnemyEndPlace”&#xff0c;用来表示终点…