首页 技术 正文
技术 2022年11月17日
0 收藏 482 点赞 2,869 浏览 5935 个字

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;@Servicepublic 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/

【第二十章】 springboot + consul(1)

上图展示了consul UI所展示的所有东西。services、nodes、kv、datacenter

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,085
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,560
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,409
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,182
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,819
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,902