Docker与Consul:构建动态服务发现与更新的微服务体系

Docker和Consul是构建微服务体系中常用的工具之一,它们可以协同工作来实现动态服务发现和更新。下面是一个简单的Java微服务体系的示例,使用Docker容器和Consul进行服务的注册、发现和更新。

1. 创建一个简单的Java微服务

首先,我们创建一个简单的Java微服务,比如一个Hello World服务。

// HelloService.java
public class HelloService {public String getGreeting(String name) {return "Hello, " + name + "!";}
}

2. 使用Spring Boot创建一个RESTful服务

我们可以使用Spring Boot来创建一个RESTful服务,它会调用上面的HelloService。

// HelloController.java
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {private final HelloService helloService;public HelloController(HelloService helloService) {this.helloService = helloService;}@GetMapping("/hello")public String sayHello(@RequestParam String name) {return helloService.getGreeting(name);}
}

3. 使用Docker容器化服务

编写Dockerfile来将我们的Java应用程序容器化。

FROM openjdk:11-jre-slim
COPY target/myapp.jar /app/myapp.jar
CMD ["java", "-jar", "/app/myapp.jar"]

4. 在Docker容器中运行服务

使用Docker构建和运行我们的服务。

docker build -t myapp .
docker run -p 8080:8080 myapp

5. 使用Consul进行服务注册和发现

现在,我们将我们的服务注册到Consul,并使用Consul来发现服务。

// ConsulServiceDiscovery.java
import com.orbitz.consul.Consul;
import com.orbitz.consul.model.agent.ImmutableRegCheck;
import com.orbitz.consul.model.agent.ImmutableRegistration;
import com.orbitz.consul.model.health.ServiceHealth;
import com.orbitz.consul.model.health.ServiceHealthKey;
import com.orbitz.consul.option.QueryOptions;import java.net.InetAddress;
import java.util.List;public class ConsulServiceDiscovery {private final Consul consul;public ConsulServiceDiscovery(String consulHost, int consulPort) {this.consul = Consul.builder().withHostAndPort(consulHost, consulPort).build();}public void registerService(String serviceName, String serviceId, int servicePort) throws Exception {ImmutableRegistration.Builder builder = ImmutableRegistration.builder().id(serviceId).name(serviceName).address(InetAddress.getLocalHost().getHostAddress()).port(servicePort).check(ImmutableRegCheck.builder().http("http://" + InetAddress.getLocalHost().getHostAddress() + ":" + servicePort + "/health").interval("10s").timeout("2s").build());consul.agentClient().register(builder.build());}public List<ServiceHealth> discoverServices(String serviceName) {return consul.healthClient().getAllServiceInstances(serviceName, QueryOptions.BLANK).getResponse();}
}

6. 在服务启动时注册到Consul

在服务启动时,我们注册服务到Consul。

// Main.java
public class Main {public static void main(String[] args) throws Exception {// Initialize Consul service discoveryConsulServiceDiscovery consulServiceDiscovery = new ConsulServiceDiscovery("localhost", 8500);// Register serviceconsulServiceDiscovery.registerService("hello-service", "hello-service-1", 8080);// Start Spring Boot applicationSpringApplication.run(MyApplication.class, args);}
}

7. 在客户端发现服务

现在,在客户端中,我们可以使用Consul来发现服务。

// HelloClient.java
import com.orbitz.consul.Consul;
import com.orbitz.consul.model.health.ServiceHealth;import java.util.List;public class HelloClient {private final ConsulServiceDiscovery consulServiceDiscovery;public HelloClient(ConsulServiceDiscovery consulServiceDiscovery) {this.consulServiceDiscovery = consulServiceDiscovery;}public String getHelloServiceUrl() {List<ServiceHealth> instances = consulServiceDiscovery.discoverServices("hello-service");if (!instances.isEmpty()) {ServiceHealth serviceHealth = instances.get(0);String host = serviceHealth.getService().getAddress();int port = serviceHealth.getService().getPort();return "http://" + host + ":" + port;} else {throw new RuntimeException("No instances of hello-service available");}}
}

8. 使用服务发现调用服务

最后,我们在客户端中使用服务发现调用服务。

// HelloServiceClient.java
import org.springframework.web.client.RestTemplate;public class HelloServiceClient {private final RestTemplate restTemplate;private final String helloServiceUrl;public HelloServiceClient(String helloServiceUrl) {this.restTemplate = new RestTemplate();this.helloServiceUrl = helloServiceUrl;}public String sayHello(String name) {return restTemplate.getForObject(helloServiceUrl + "/hello?name=" + name, String.class);}
}

这就是一个简单的使用Docker和Consul构建动态服务发现和更新的Java微服务体系的示例。在实际项目中,可能还需要考虑更多的安全性、高可用性等方面的问题。

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

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

相关文章

1.4. 离散时间鞅-鞅的Lp收敛,鞅与停时 (2)

鞅的L^p收敛p > 1,鞅与停时 鞅的L^p收敛(p > 1),鞅与停时2. 极大值不等式2.1. Doob不等式-时间有界2.2. L p L^{p} L

MySQL主从切换测试

测试主从高可用 确认mha正常运行中ps -ef | grep mha #一般在kde-offline3节点 mysql 166898 1 1 17:54 pts/0 00:00:00 perl /bin/masterha_manager --conf=/data/apps/mha4mysql-manager-0.58/app13306.cnf --ignore_last_failover 如果未启动则需要手动执行mha…

数据结构之----栈与队列

栈是限定仅在表尾进行插入和删除操作的线性表&#xff1b; 队列是只允许在一端进行插入操作&#xff0c;而另一端进行删除操作的线性表&#xff1b; 栈&#xff0c;允许插入和删除的一端称为栈顶&#xff0c;另一端称为栈底&#xff0c;特点后进先出。 插入操作称为进栈&#…

【全网首发】大模型入门、概念详解、综述

大模型教程 注NLP入门、大模型入门、NLP发展、NLP四范式、综述入门必读图像相关大模型相关微调相关多模态相关其他注 多数文章博主已经读完,有中文笔记、代码、私信博主领取也可以相互交流学习。笔记写在flowus中会逐渐迁移到博客。 NLP入门、大模型入门、NLP发展、NLP四范式…

for box,score,cat in zip(xywhboxes,scores,cats):

zip()函数可以将多个可迭代对象打包成一个元组序列&#xff0c;这些对象的元素会一一对应&#xff0c;例如&#xff1a; a [1, 2, 3] b [a, b, c] c zip(a, b) print(list(c)) 输出为 [(1, a), (2, b), (3, c)] for循环中的zip()函数将它们打包成一个元组序列&#xff0…

Android中C++如何读写json文件

我们需要在json文件中记录一下总数&#xff0c;文件格式如下&#xff1a; [{"total_count":0,"total_count1":0,"total_count2":0,"total_count3":0,"total_count4":0}] 目录 1. Android.bp中新增 2. 头文件添加 3. 向jso…

websocket和http协议的区别

ws(websocket)协议和http协议是两种不同的协议。 http&#xff1a;http是一种用于传输超文本的应用层协议&#xff0c;通常用于web端浏览器和web端服务器之间传输数据。http也是基于tcp的&#xff0c;但是HTTP只能在同一时刻单向发送消息&#xff0c;是一种半双工通信。&#…

ISIS学习二——与OSPF相比的ISIS报文以及路由计算

目录 一.ISIS支持的网络类型 1.OSPF支持 2.ISIS支持 二.ISIS最优路径的选取 &#xff08;1&#xff09;.ISIS开销值设置 1.全局开销 2.接口开销 3.根据带宽设置开销 &#xff08;2&#xff09;.ISIS的次优路径 三.ISIS报文格式 1.ISIS专用报头——TLV 2.ISIS通用头…

LeetCode-2391. 收集垃圾的最少总时间【数组 字符串 前缀和】

LeetCode-2391. 收集垃圾的最少总时间【数组 字符串 前缀和】 题目描述&#xff1a;解题思路一&#xff1a;处理垃圾和路程单独计算。解题思路二&#xff1a;逆向思维&#xff0c;计算多走的路解题思路三&#xff1a;只记录&#xff0c;当前t需要计算几次 题目描述&#xff1a;…

SAF文件选择、谷歌PhotoPicker图片视频选择与真实路径转换

一、构建选择文件与回调方法 //文件选择回调ActivityResultLauncher<String[]> pickFile registerForActivityResult(new ActivityResultContracts.OpenDocument(), uri->{if (uri ! null) {Log.e("cxy", "返回的uri:" uri);Log.e("cxy&q…

计算机实战分享3:森林火灾预测分析可视化机器学习预测-完整数据代码-可直接运行

直接看实验数据和结果: 代码: from sklearn import preprocessing import random from sklearn.m

持续总结中!2024年面试必问 100 道 Java基础面试题(四十二)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问 100 道 Java基础面试题&#xff08;四十一&#xff09;-CSDN博客 八十三、如何判断一个对象是否应该被垃圾回收&#xff1f; 在Java中&#xff0c;判断一个对象是否应该被垃圾回收的关键在于对象的引用状态。垃圾…

C# 调用 winmm.dll 播放 midi 文件

在C#中调用 winmm.dll&#xff08;Windows Multimedia Library&#xff09;来播放 MIDI 文件通常涉及使用mciSendString 函数&#xff0c;该函数是 winmm.dll 中提供的一个函数&#xff0c;用于发送 MCI&#xff08;Media Control Interface&#xff09;命令给MCI设备。 但是&…

基于LLM的自行车道CAD

LLM&#xff08;大型语言模型&#xff09;是强大的工具。对于许多人来说&#xff0c;用语言表达愿望通常比浏览复杂的 GUI 更简单。 1、系统简介和环境搭建 urb-x.ch&#xff0c;这是一家专门从事自行车道建设的公司。轨道采用模块化构建块进行独特设计&#xff0c;可以通过多…

HCIP的学习(15)

第六章&#xff0c;BGP—边界网关协议 自治系统—AS ​ 定义&#xff1a;由一个单一的机构或组织所管理的一系列IP网络及其设备所构成的集合。 ​ AS的来源&#xff1a; 整个网络规模过大&#xff0c;会导致路由信息收敛速度过慢&#xff0c;设备对相同目标认知不同。AS之间…

全国院校及梯度排序深度解析课(免费下载-帮助更多高考生做出人生重要的选择。)

"全国院校及梯度排序深度解析课"旨在深入探讨全国院校的排名及梯度排序原理。通过系统解析各院校的学术声誉、师资力量、科研水平等因素&#xff0c;帮助学员全面了解院校排名的背后逻辑&#xff0c;为选择合适院校提供理论支持。 课程大小&#xff1a;7G 课程下载…

Java面试之分布式篇

分布式锁的实现方案 &#xff08;1&#xff09;用数据库实现分布式锁比较简单&#xff0c;就是创建一张锁表&#xff0c;数据库对字段作唯一性约束。加锁的时候&#xff0c;在锁表中增加一条记录即可&#xff1b;释放锁的时候删除锁记录就行。如果有并发请求同时提交到数据库&…

css-页面布局-定位大解析-每文一言(世界上,没有人可以支持你一辈子)

&#x1f390;每文一言 世界上,没有人可以支持你一辈子 目录 &#x1f390;每文一言 &#x1f381;css定位 &#x1f9e7;静态定位 position: static &#x1f384;相对定位 position:relative &#x1f380;绝对定位 position:absolute &#x1f383;固定定位 position…

Yoast SEO Premium插件下载,提升您的网站SEO排名

在当今数字化时代&#xff0c;网站的搜索引擎优化&#xff08;SEO&#xff09;至关重要。它不仅影响着网站的可见度&#xff0c;更直接关系到您的在线业务成功与否。如果您正在寻找一个能够显著提升网站SEO表现的工具&#xff0c;Yoast SEO Premium插件将是您的理想选择。 为什…

赶紧收藏!2024 年最常见 100道 Java 基础面试题(四十一)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见 100道 Java 基础面试题&#xff08;四十&#xff09;-CSDN博客 八十一、tcp为什么要三次握手&#xff0c;两次不行吗&#xff1f;为什么&#xff1f; TCP&#xff08;传输控制协议&#xff09;使用三次握手&#xf…