第二十章 springboot + consul(1)
consul的具体安装与操作查看博客的consul系列。
一、启动consul
(1个server+1个client,方便起见,client使用本机):查看:http://www.cnblogs.com/java-zhao/p/5375132.html
1、开启虚拟机-->切换到vagrantFile中配置的节点
- vagrant up
- vagrant ssh n110
2、启动server(n110)
consul agent -server -bootstrap-expect=1 -data-dir=/tmp/consul -node=server-110 -bind=192.168.21.110 -dc=zjgdc1 -client 0.0.0.0 -ui
说明:-client 0 0 0 0 -ui-->使得客户端可以直接通过url访问服务端的consul ui
3、启动client(local)
- consul agent -data-dir=/tmp/consul -node=client-my -bind=xxx -dc=zjgdc1
说明:xxx代表本机IP
4、client加入server
- consul join 192.168.21.110
二、java部分
1、pom.xml
<!-- consul-client -->
<dependency>
<groupId>com.orbitz.consul</groupId>
<artifactId>consul-client</artifactId>
<version>0.10.0</version>
</dependency>
<!-- consul需要的包 -->
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.22.2</version>
</dependency>
说明:consul的java客户端有两个:consul-client和consul-api。
consul-client的github地址:https://github.com/OrbitzWorldwide/consul-client
2、ConsulService
package com.xxx.firstboot.service; import java.net.MalformedURLException;
import java.net.URI;
import java.util.List; import org.springframework.stereotype.Service; import com.orbitz.consul.AgentClient;
import com.orbitz.consul.Consul;
import com.orbitz.consul.HealthClient;
import com.orbitz.consul.KeyValueClient;
//import com.orbitz.consul.NotRegisteredException;
import com.orbitz.consul.StatusClient;
import com.orbitz.consul.model.health.ServiceHealth; @Service
public class ConsulService { /**
* 注册服务
* 并对服务进行健康检查
* servicename唯一
* serviceId:没发现有什么作用
*/
public void registerService(String serviceName, String serviceId) {
Consul consul = Consul.builder().build(); //建立consul实例
AgentClient agentClient = consul.agentClient(); //建立AgentClient try {
/**
* 注意该注册接口:
* 需要提供一个健康检查的服务URL,以及每隔多长时间访问一下该服务(这里是3s)
*/
agentClient.register(8080, URI.create("http://localhost:8080/health").toURL(), 3, serviceName, serviceId, "dev");
} catch (MalformedURLException e) {
e.printStackTrace();
}
// try {
// agentClient.pass(serviceId);//健康检查
// } catch (NotRegisteredException e) {
// e.printStackTrace();
// }
} /**
* 发现可用的服务
*/
public List<ServiceHealth> findHealthyService(String servicename){
Consul consul = Consul.builder().build();
HealthClient healthClient = consul.healthClient();//获取所有健康的服务
return healthClient.getHealthyServiceInstances(servicename).getResponse();//寻找passing状态的节点
} /**
* 存储KV
*/
public void storeKV(String key, String value){
Consul consul = Consul.builder().build();
KeyValueClient kvClient = consul.keyValueClient();
kvClient.putValue(key, value);//存储KV
} /**
* 根据key获取value
*/
public String getKV(String key){
Consul consul = Consul.builder().build();
KeyValueClient kvClient = consul.keyValueClient();
return kvClient.getValueAsString(key).get();
} /**
* 找出一致性的节点(应该是同一个DC中的所有server节点)
*/
public List<String> findRaftPeers(){
StatusClient statusClient = Consul.builder().build().statusClient();
return statusClient.getPeers();
} /**
* 获取leader
*/
public String findRaftLeader(){
StatusClient statusClient = Consul.builder().build().statusClient();
return statusClient.getLeader();
} }
列出了常用API。
注意:
- 服务注册的时候不需要传递IP
- 服务注册的时候需要给出health check的url和时间间隔。该url是一个服务(要提供该服务,需要使用spring boot actuator,具体操作如下:)。
直接在pomx.ml中加入:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
此时重启应用后,访问http://localhost:8080/health,得到如下结果一个json串:
{
status: "UP",
diskSpace: - {
status: "UP",
total: 249769230336,
free: 182003318784,
threshold: 10485760
},
rabbit: - {
status: "UP",
version: "3.6.1"
},
mongo: - {
status: "UP",
version: "3.2.6"
},
db: - {
status: "UP",
myTestDbDataSource: - {
status: "UP",
database: "MySQL",
hello: 1
},
myTestDb2DataSource: - {
status: "UP",
database: "MySQL",
hello: 1
},
dataSource: - {
status: "UP",
database: "MySQL",
hello: 1
}
},
_links: - {
self: - {
href: "http://localhost:8080/health"
}
}
}
Format online
说明:status
- UP:服务器正常(以上只要有一个组件DOWN,服务器就处于DOWN,所以我需要启动服务器上的mongo和rabbitmq,这里我之前使用了这两个组件)
- DOWN:服务器挂了
3、ConsulController
package com.xxx.firstboot.web; import java.util.List; import org.springframework.beans.factory.annotation.Autowired;
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.RestController; import com.orbitz.consul.model.health.ServiceHealth;
import com.xxx.firstboot.service.ConsulService; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; @Api("consul相关API")
@RestController
@RequestMapping("/consul")
public class ConsulController {
@Autowired
private ConsulService consulService; /*******************************服务注册与发现*******************************/
@ApiOperation("注册服务")
@RequestMapping(value="/registerService/{servicename}/{serviceid}",method=RequestMethod.POST)
public void registerService(@PathVariable("servicename") String serviceName,
@PathVariable("serviceid") String serviceId) {
consulService.registerService(serviceName, serviceId);
} @ApiOperation("发现服务")
@RequestMapping(value="/discoverService/{servicename}",method=RequestMethod.GET)
public List<ServiceHealth> discoverService(@PathVariable("servicename") String serviceName) {
return consulService.findHealthyService(serviceName);
} /*******************************KV*******************************/
@ApiOperation("store KV")
@RequestMapping(value="/kv/{key}/{value}",method=RequestMethod.POST)
public void storeKV(@PathVariable("key") String key,
@PathVariable("value") String value) {
consulService.storeKV(key, value);
} @ApiOperation("get KV")
@RequestMapping(value="/kv/{key}",method=RequestMethod.GET)
public String getKV(@PathVariable("key") String key) {
return consulService.getKV(key);
} /*******************************server*******************************/
@ApiOperation("获取同一个DC中的所有server节点")
@RequestMapping(value="/raftpeers",method=RequestMethod.GET)
public List<String> findRaftPeers() {
return consulService.findRaftPeers();
} @ApiOperation("获取leader")
@RequestMapping(value="/leader",method=RequestMethod.GET)
public String leader() {
return consulService.findRaftLeader();
}
}
4、测试(通过swagger测试+通过consul UI查看结果)
- swagger:http://localhost:8080/swagger-ui.html
- consul UI:http://192.168.21.110:8500/ui/
上图展示了consul UI所展示的所有东西。services、nodes、kv、datacenter
第二十章 springboot + consul(1)的更多相关文章
- JavaScript高级程序设计:第二十章
第二十章 一.语法 JSON的语法可以表示以下三种类型的值: (1)简单值 (2)对象 JSON的对象与javascript字面量有一些不同.例如,在javascript中,前面的对象字面量可以写成下 ...
- 第二十章 Django数据库实战
第二十章 Django数据库实战 第一课 获取单表单数据的三种方式: urls.py中的路由代码: path('busniess',views.busniess), views.py中代码: def ...
- Gradle 1.12翻译——第二十章. 构建环境
有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...
- “全栈2019”Java多线程第二十章:同步方法产生死锁的例子
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java异常第二十章:自定义异常详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- “全栈2019”Java第二十章:按位与、按位或、异或、反码、位运算
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 2017.3.14 activiti实战--第二十章--REST服务
学习资料:<Activiti实战> 第二十章 REST服务 20.1 通信协议概述 略. 20.2 REST API概述 资源分类 资源基础URI 说明 Deployments manag ...
- python 教程 第二十章、 数据库编程
第二十章. 数据库编程 环境设置 1).安装MySQL-python http://www.lfd.uci.edu/~gohlke/pythonlibs/ MySQL-python-1.2.3.win ...
- 20190920 On Java8 第二十章 泛型
第二十章 泛型 多态的泛化机制: 将方法的参数类型设为基类: 方法以接口而不是类作为参数: 使用泛型: 泛型实现了参数化类型 简单泛型 Java 泛型的核心概念:你只需告诉编译器要使用什么类型,剩下的 ...
随机推荐
- hdu-5023线段树刷题
title: hdu-5023线段树刷题 date: 2018-10-18 13:32:13 tags: acm 刷题 categories: ACM-线段树 概述 这道题和上次做的那道染色问题一样, ...
- Hades:移动端静态分析框架
只有通过别人的眼睛,才能真正地了解自己 ——<云图> 背景 作为全球最大的互联网 + 生活服务平台,美团点评近年来在业务上取得了飞速的发展.为支持业务的快速发展,移动研发团队规模也逐渐从零 ...
- BZOJ2055 80人环游世界 网络流 费用流 有源汇有上下界的费用流
https://darkbzoj.cf/problem/2055 https://blog.csdn.net/Clove_unique/article/details/54864211 ←对有上下界费 ...
- BZOJ 4066 简单题(KD树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4066 [题目大意] 要求维护矩阵内格子加点和矩阵查询 [题解] 往KD树上加权值点,支 ...
- 2013年JavaScript开发人员调查结果
JavaScript开发人员调查现在已经结束,一如既往社区对结果进行了进一步分析: 总结(汉语) 原始数据(电子表格) 2012年结果 51%的被参与者写客户端代码,而28%的人说他们编写服务器端代码 ...
- 【10.26校内测试】【状压?DP】【最小生成树?搜索?】
Solution 据说正解DP30行??? 然后写了100行的状压DP?? 疯狂特判,一算极限时间复杂度过不了aaa!! 然而还是过了....QAQ 所以我定的状态是待转移的位置的前三位,用6位二进制 ...
- Codeforces Round #257 (Div. 2) A. Jzzhu and Children
A. Jzzhu and Children time limit per test 1 second memory limit per test 256 megabytes input standar ...
- Redis_常见JedisConnectionException异常分析
最近项目开发中用到了Redis, 选择了官网推荐的java client Jedis.Redis常用命令学习:http://redis.io/commandsRedis官方推荐Java客户端Jedis ...
- Polly简介 — 1. 故障处理策略
Polly 是 .Net 下的一套瞬时故障处理及恢复的函式库,可让开发者以fluent及线程安全的方式来应用诸如Retry.Circuit Breaker.Timeout.Bulkhead Isola ...
- Dropbox Folder Sync – 让 Dropbox 同步任意文件夹
「DropBox」可以说是目前世界上最流行的线上同步工具,非常简单的同步方式, 流畅的档桉上传下载速度,让你可以轻易的在两台.三台电脑之间同步重要资料. 而你要做的步骤只是在每一台电脑安装DropBo ...