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

news2024/11/25 18:42:11

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 {

    @Autowired
    RegisterList 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;

    //发送注册消息
    @Override
    public 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: 8001

model:
  name: "provider"
  port: "8001"
  host: "127.0.0.1"

register:
  url: "http://localhost:8080/register/register"

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

5. 测试

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenCV for Python 入坑第三天 :图片处理(2)

上一篇博客我们了解了图像在OpenCV中的保存方式。并且我们自己上手创建了一张灰度图像和一张彩色图像。除此之外&#xff0c;我们还了解到了彩色图像通道在OpenCV中和我们日常所了解的不一样&#xff0c;是通过BGR的顺序进行编码的。咱们一定要记清楚哦~ 那么今天&#xff0c;我…

tinymce编辑器导入docx、doc格式Word文档完整版

看此文章之前需要注意一点 在前端使用导入Word文档并自动解析成html再插入到tinymce编辑器中&#xff0c;在这里我使用的是mammoth.js识别Word内容&#xff0c;并set到编辑器中&#xff0c;使用mammoth只可解析.docx格式的Word&#xff0c;目前的mammoth不支持.doc格式&#x…

Ghost Buster Pro for mac(快速清理卸载的应用残存文件)

Ghost Buster Pro for mac可从您已卸载的应用程序中查找并删除文件。该应用程序速度快如闪电&#xff0c;可立即释放内存。 许多应用程序都安装在计算机上&#xff0c;但它们通常只会在您的计算机上停留很短的时间。每个应用程序都会创建文件&#xff0c;但删除应用程序不会删…

01 - 如何制定性能调优标准?

1、为什么要做性能调优&#xff1f; 一款线上产品如果没有经过性能测试&#xff0c;那它就好比是一颗定时炸弹&#xff0c;你不知道它什么时候会出现问题&#xff0c;你也不清楚它能承受的极限在哪儿。 有些性能问题是时间累积慢慢产生的&#xff0c;到了一定时间自然就爆炸了…

使用dhtmlx-gantt甘特图插件定制预约表【实战】

示例传送门 定制预约表展示 一、安装 npm i dhtmlx-gantt二、配置解释与汇总 //自定义表头列 gantt.config.columns = [{name: "

服务器部署 Python 项目总结

title: 服务器部署 Python 项目总结 date: 2023-07-05 16:33:49 tags: 服务器Python categories:服务器 cover: https://cover.png feature: false 1. 准备 Python 项目需要 Python 的环境&#xff0c;假如服务器操作系统为 CentOS 7 的话&#xff0c;默认安装了 Python2 与 …

安达发|APS高级排程系统界的天花板!

APS 系统不仅为生产部门提供制造依据&#xff0c;而且涉及到采购计划、安全库存、订单交付等方面。这是非常复杂的管理。一个易于使用的 APS 系统不仅能够充分整合生产相关业务流程&#xff0c;保证生产计划的顺利进行&#xff0c;而且能够大大提高生产效率&#xff0c;降低管理…

导出python环境的所有安装包

导出操作 pip freeze > requests.txt批量导入操作 pip install -r requests.txt

redis数据类型基本操作(list,string,hash,keys相关操作),mongodb(增删改查)

1、 string类型数据的命令操作&#xff1a; &#xff08;1&#xff09; 设置键值&#xff1a; &#xff08;2&#xff09; 读取键值&#xff1a; &#xff08;3&#xff09; 数值类型自增1&#xff1a; &#xff08;4&#xff09; 数值类型自减1&#xff1a; &#xff08;5…

Java面试突击

Java面向对象有哪些特征&#xff0c;如何应用 ​ 面向对象编程是利用类和对象编程的一种思想。万物可归类&#xff0c;类是对于世界事物的高度抽象 &#xff0c;不同的事物之间有不同的关系 &#xff0c;一个类自身与外界的封装关系&#xff0c;一个父类和子类的继承关系&…

三菱PLC 控制灯一秒钟交替闪烁

三菱PLC中常用的特殊继电器&#xff1a; M8000 上电一直ON标志 M8002 上电导通一次 M8004 PLC出错 M8005 PLC备用电池电量低标志 M8011 10ms时钟脉冲 M8012 100ms时钟脉冲 M8013 1s时钟脉冲 M8014 1min时钟脉冲 M8034…

【论文笔记】图像修复MPRNet:Multi-Stage Progressive Image Restoration 含代码解析

目录 一、介绍 二、使用方法 1.推理 2.训练 三、MPRNet结构 1.整体结构 2.CAB(Channel Attention Block) 3.Stage1 Encoder 4.Stage2 Encoder 5.Decoder 6.SAM(Supervised Attention Module) 7.ORSNet(Original Resolution Subnetwork) 四、损失函数 1.Charbonni…

[LINUX]之grep文本过滤

linux通过使用grep -v操作来实现文本过滤 新创建文本如下 执行过滤命令如下&#xff0c;已经过滤了test3 cat test.txt |grep -v "test3"

Dockerd的迁移与备份

1、容器保存为镜像 &#xff08;1&#xff09; 通过以下命令将容器保存为镜像 # 保存nginx容器为镜像 docker commit 容器名称 镜像名称 例如&#xff1a;docker commit mynginx mynginx_i&#xff08;2&#xff09;用 docker ps -a 查看所有的容器 &#xff08;3&#xf…

15-C++基本算法-贪心法

&#x1f4da; 理论基础 贪心法&#xff08;Greedy Algorithm&#xff09;是一种常见的算法思想&#xff0c;它在每一步选择中都采取当前状态下最优的选择&#xff0c;以期望获得全局最优解。贪心法通常适用于问题具有最优子结构和贪心选择性质的情况。 适用场景 贪心法适用…

react 实现浮动可吸附悬浮窗,悬浮球,悬浮按钮,支持拖动拖拽功能(suspend-button)

前言&#xff1a; 最近在做移动端&#xff0c;有个需求是 实现一个浮动球可拖拽&#xff0c;能吸附&#xff08;吸附到 左右两则&#xff0c;距离哪进就吸附到哪边&#xff09;。 实现过程&#xff1a; 使用 suspend-button &#xff08;但是此组件不支持 ts 和pc端&#x…

VMWare安装统信UOS虚拟机

单击 创建新的虚拟机 按钮&#xff0c;然后选择 自定义&#xff0c; 然后 下一步 硬件兼容性 选择 Workstation16.x &#xff0c;然后 下一步 选择“稍后安装操作系统”&#xff0c; 然后 下一步 选择 Linux &#xff0c; 再选 版本 CentOS 8 64位/ Ubuntu 均可&#xff0c;然…

【数据结构之树】初阶数据结构之树的实现及其各种方式(上)

文章目录 &#x1f60f;专栏导读&#x1f916;文章导读&#x1f640;树的预备知识&#x1f640;二叉树&#x1f633;树的代码实现及其各类讲解&#x1f332;树的结构体初始化 总结 &#x1f60f;专栏导读 &#x1f47b;作者简介&#xff1a;M malloc&#xff0c;致力于成为嵌入…

LinkNet分割模型搭建

原论文&#xff1a;LinkNet: Exploiting Encoder Representations for Efficient Semantic Segmentation 直接步入正题~~~ 一、LinkNet 1.decoder模块 class DecoderBlock(nn.Module):def __init__(self, in_channels, n_filters): #512, 256super(DecoderBlock, self).__in…

计算机毕业论文选题推荐|软件工程|信息管理|数据分析|系列二

文章目录 导文题目导文 计算机毕业论文选题推荐|软件工程|信息管理|数据分析|系列二 (***语言)==使用其他任何编程语言 例如:基于(***语言)门窗账务管理系统的设计与实现 得到:基于JAVA门窗账务管理系统的设计与实现 基于vue门窗账务管理系统的设计与实现 等等 题目 …