spring cloud:搭建基于consul的服务提供者集群(spring cloud hoxton sr8 / spring boot 2.3.4)
一,搭建基于consul的服务提供者集群
1,consul集群,共3个实例:
2, 服务提供者集群:共2个实例:
3,服务消费者:一个实例即可
4,consul集群的搭建,请参考:
https://www.cnblogs.com/architectforest/p/13735545.html
5,演示例子实现生产环境中需要的高可用:
consul server集群和服务提供者集群
说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest
对应的源码可以访问这里获取: https://github.com/liuhongdi/
说明:作者:刘宏缔 邮箱: 371125307@qq.com
二,演示项目的相关信息:
1,两个项目的地址:
服务提供者:
https://github.com/liuhongdi/cloudconsul
服务消费者:
https://github.com/liuhongdi/consulconsumer
2,项目的功能说明
演示了基于consul实现的服务提供者和消费者,
基于consul集群和消费者集群
3,服务提供者项目的结构:如图
4,服务消费者项目的结构:如图
三,服务提供者项目的配置文件说明
1,pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency> <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
2,application.properties
spring.application.name=provider1
server.port=8080
#
spring.cloud.consul.host=127.0.0.1
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.service-name=lhdprovider
spring.cloud.consul.discovery.prefer-ip-address=true
spring.cloud.consul.discovery.instance-id=${spring.application.name}:${spring.cloud.client.ip-address}
provider.name = p1
3,application-provider2.properties
spring.application.name=provider2
server.port=8080
#
spring.cloud.consul.host=127.0.0.1
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.service-name=lhdprovider
spring.cloud.consul.discovery.prefer-ip-address=true
spring.cloud.consul.discovery.instance-id=${spring.application.name}:${spring.cloud.client.ip-address}
provider.name = p2
说明:spring.cloud.consul.discovery.prefer-ip-address=true:
这个配置项的作用是consul中提供的服务名称是ip和port,
这样消费者可以直接访问服务提供者,否则的话,
需要在运行服务消费者的机器上配置实例名称和ip的对应到 /etc/hosts当中才行
四,服务提供者项目的java代码说明
1,DemoApplication.java
@EnableDiscoveryClient
@SpringBootApplication
public class DemoApplication { public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
} }
2,HomeController.java
@RestController
@RequestMapping("/home")
public class HomeController { @Resource
private DiscoveryClient discoveryClient; @Value("${provider.name}")
private String name; @Value("${server.port}")
private String port; // list services
@GetMapping("/serviceslist")
public Object serviceslist() {
return discoveryClient.getServices();
} // list instances in a service id
@GetMapping("/instanceslist")
public Object instanceslist() {
return discoveryClient.getInstances("consul");
} //test api
@GetMapping("/hello")
public String hello() {
String ip = "";
try {
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface current = interfaces.nextElement();
if (!current.isUp() || current.isLoopback() || current.isVirtual()) continue;
Enumeration<InetAddress> addresses = current.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress addr = addresses.nextElement();
if (addr.isLoopbackAddress()) continue;
ip = addr.getHostAddress();
}
}
} catch (SocketException e) {
e.printStackTrace();
}
System.out.println("ip:"+ip);
//return discoveryClient.getInstances("consul");
String res = "ip:"+ip+";name:"+name+";port:"+port;
return res;
}
}
五,服务消费者项目的配置文件说明
1,pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2,application.properties
spring.application.name=lhdconsumer
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.register=false
server.port=8081
六,服务消费者项目的java代码说明
1,DemoApplication.java
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class DemoApplication { public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
} }
2,HiService.java
@Service
public class HiService { @Resource
HomeFeignClient homeFeignClient; public String sayHi(String name){
return homeFeignClient.sayHifromClient();
}
}
3,HomeFeignClient.java
@FeignClient(value="lhdprovider")
public interface HomeFeignClient {
@GetMapping(value="/home/hello")
String sayHifromClient();
}
4,HomeController.java
@RestController
@RequestMapping("/home")
public class HomeController { @Resource
HiService hiService; @GetMapping("/hi")
public String sayHi(){
return hiService.sayHi();
}
}
七,搭建服务提供者集群
provider1上:
1,启动consul
[root@provider1 /]# nohup /usr/local/soft/consul agent -data-dir=/data/consul/data -node=provider1 -bind=172.17.0.5 -datacenter=dc1 -client=0.0.0.0 -join=172.17.0.2 > /dev/null 2>&1 &
2,启动服务:
[root@provider1 /]# /usr/local/soft/jdk-13/bin/java -jar /usr/local/soft/demo-0.0.1-SNAPSHOT.jar
provider2上:
1,启动consul
[root@provider2 /]# nohup /usr/local/soft/consul agent -data-dir=/data/consul/data -node=provider2 -bind=172.17.0.6 -datacenter=dc1 -client=0.0.0.0 -join=172.17.0.2 > /dev/null 2>&1 &
[1] 206
2,启动服务:
[root@provider2 /]# /usr/local/soft/jdk-13/bin/java -jar /usr/local/soft/demo-0.0.1-SNAPSHOT.jar --spring.profiles.active=provider2
八,测试效果
1,服务启动后,查看服务提供的情况:
访问:
http://172.17.0.5:8080/home/hello
返回:
ip:172.17.0.5;name:p1;port:8080
访问:
http://172.17.0.6:8080/home/hello
返回:
ip:172.17.0.6;name:p2;port:8080
2,测试服务消费者:访问:
http://127.0.0.1:8081/home/hi
返回:
ip:172.17.0.5;name:p1;port:8080
刷新后返回:
ip:172.17.0.6;name:p2;port:8080
3,测试高可用:关掉服务:
在provider2上,把服务停掉:
直接ctrl-c关掉或者kill也可
ip:172.17.0.6
ip:172.17.0.6
^C2020-10-06 08:41:30.727 INFO 379 --- [extShutdownHook] o.s.s.c.ThreadPoolTaskScheduler : Shutting down ExecutorService 'catalogWatchTaskScheduler'
2020-10-06 08:41:30.738 INFO 379 --- [extShutdownHook] o.s.c.c.s.ConsulServiceRegistry : Deregistering service with consul: provider2-172-17-0-6
2020-10-06 08:41:30.780 INFO 379 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
然后查看consul的web ui:
可以看到lhdprovider中只剩下了一个实例:
访问服务消费者:
http://127.0.0.1:8081/home/hi
返回:
ip:172.17.0.5;name:p1;port:8080
反复刷新后返回结果中也没有provider2的返回,只有p1的返回,
说明高可用有效
4,测试高可用:关掉consul的agent
把上面所掉的provider2的服务再次启动
这次我们关掉provider1上的consul client
[root@provider1 /]# ps auxfww
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 495 0.5 0.0 12028 3012 pts/2 Ss 08:48 0:00 /bin/bash
root 508 0.0 0.0 43964 3084 pts/2 R+ 08:48 0:00 \_ ps auxfww
root 200 0.0 0.0 12128 180 pts/1 Ss 01:16 0:00 /bin/bash
root 239 0.4 0.5 784952 23788 pts/1 Sl 07:09 0:24 \_ /usr/local/soft/consul agent -data-dir=/data/consul/data -node=provider1 -bind=172.17.0.5 -datacenter=dc1 -client=0.0.0.0 -join=172.17.0.2
root 453 0.8 2.2 3619488 91824 pts/1 Sl+ 07:42 0:34 \_ /usr/local/soft/jdk-13/bin/java -jar /usr/local/soft/demo-0.0.1-SNAPSHOT.jar
root 1 0.0 0.0 93860 376 ? Ss 01:15 0:00 /usr/sbin/init
root 25 0.0 0.0 91304 1176 ? Ss 01:15 0:00 /usr/lib/systemd/systemd-journald
root 33 0.0 0.0 88832 76 ? Ss 01:15 0:00 /usr/lib/systemd/systemd-udevd
dbus 66 0.0 0.0 52812 0 ? Ss 01:15 0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
[root@provider1 /]# kill 239
[root@provider1 /]# kill 239
[root@provider1 /]# kill 239
bash: kill: (239) - No such process
查看consul的web ui,只剩下了provider2
访问消费者:
http://127.0.0.1:8081/home/hi
只返回:
ip:172.17.0.6;name:p2;port:8080
5,测试高可用:关掉consul集群中的一个:
[root@consul1 /]# /usr/local/soft/consul leave
Graceful leave complete
[1]+ Done nohup /usr/local/soft/consul agent -server -bind=172.17.0.2 -client=0.0.0.0 -bootstrap-expect=2 -data-dir=/data/consul/da -node=server-2 > /dev/null 2>&1
查看consul web ui,只剩下了两个实例
进入查看:
测试服务消费者:访问:
http://127.0.0.1:8081/home/hi
可以正常访问
九,查看spring boot版本:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.3.4.RELEASE)
spring cloud:搭建基于consul的服务提供者集群(spring cloud hoxton sr8 / spring boot 2.3.4)的更多相关文章
- 基于Docker的Consul服务发现集群搭建
在去年的.NET Core微服务系列文章中,初步学习了一下Consul服务发现,总结了两篇文章.本次基于Docker部署的方式,以一个Demo示例来搭建一个Consul的示例集群,最后给出一个HA的架 ...
- Tomcat:基于Apache+Tomcat的集群搭建
根据Tomcat的官方文档说明可以知道,使用Tomcat配置集群需要与其它Web Server配合使用才可以完成,典型的有Apache和IIS. 这里就使用Apache+Tomcat方式来完成基于To ...
- spring cloud:通过client访问consul集群(spring cloud hoxton sr8 / spring boot 2.3.4)
一,为什么要搭建consul的client? 1,网上的很多资料,访问consul时用的单机模式,这样是不可以直接在生产环境中使用的 还有一些资料,搭建了consul的集群后,直接访问集群中的某一个i ...
- 基于 Docker 搭建 Consul 多数据中心集群
本文介绍了在 Windows 10 上基于 Docker 搭建 Consul 多数据中心集群的步骤,包括 Consul 镜像的拉取和容器的创建,每个数据中心对应服务端节点和客户节点的创建,节点之间相互 ...
- 基于zookeeper的Swarm集群搭建
简介 Swarm:docker原生的集群管理工具,将一组docker主机作为一个虚拟的docker主机来管理. 对客户端而言,Swarm集群就像是另一台普通的docker主机. Swarm集群中的每台 ...
- 基于Twemproxy的Redis集群搭建以及想法
基于Twemproxy的Redis集群方案(转) redis3.0 已经发布了几个月了,但是我这等菜鸟到网上还是没有找到很好的关于搭建redis3.0集群的文章,而且好像很多公司的redis版本还保持 ...
- 基于centos6.5 hbase 集群搭建
注意本章内容是在上一篇文章“基于centos6.5 hadoop 集群搭建”基础上创建的 1.上传hbase安装包 hbase-0.96.2-hadoop2 我的目录存放在/usr/hadoop/hb ...
- Spring+Shiro搭建基于Redis的分布式权限系统(有实例)
摘要: 简单介绍使用Spring+Shiro搭建基于Redis的分布式权限系统. 这篇主要介绍Shiro如何与redis结合搭建分布式权限系统,至于如何使用和配置Shiro就不多说了.完整实例下载地址 ...
- (转)基于keepalived搭建MySQL的高可用集群
基于keepalived搭建MySQL的高可用集群 原文:http://www.cnblogs.com/ivictor/p/5522383.html MySQL的高可用方案一般有如下几种: keep ...
随机推荐
- charles常用功能 request和response(简单的操作)
先介绍一个修改request请求参数值的方法吧 第一步: 拷贝完成后还需要配置一下: 先添加一个: 然后下一步: 最后点击OK,就可以开始操作request和response数据了 先修改reques ...
- git代码管理——克隆项目到本地仓库及上传本地项目到仓库
一.克隆项目到本地仓库 1.github网站操作 1.1 登录github 首先创建一个仓库,点击“New” 1.2 输入仓库信息 1.3 创建完成后,会多出一个仓库 2.安装git客户端 2.1 安 ...
- HTML+CSS实现大盒子在小盒子的展示范围内进行滚动展示
HTML+CSS实现大盒子在小盒子的展示范围内进行滚动展示 1.效果展示: 2.主要代码:样式: overflow:auto; 3.如果想要消除对应的滚动条: .out::-webkit-scroll ...
- ps -ef | grep使用详解
转载于: https://www.cnblogs.com/freinds/p/8074651.html ps命令将某个进程显示出来 grep命令是查找 中间的|是管道命令 是指ps命令与grep同 ...
- Laver 文件版本遍历器
系统简介 最近有个需求,需要罗列出各个目录中文件的信息,检索各类文件的最新版本.网上看了很多方式,但发现没有合适的.于是利用空余时间开始编写了一套文件遍历系统,如此便有了Laver(紫菜).Laver ...
- 最新版PyCharm激活教程!有效期至2089年!
Python的编译器有很多,像Pycharm.VsCode.Jupyter...哪个好用不做评价,各有各的优点!用过PyCharm的同学都知道,PyCharm有两大版本,专业版和社区版,专业版相当于社 ...
- HAProxy安装配置
概念 HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案. HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要 ...
- Python正则表达式 re.sub()函数:标志位flags与参数个数问题
这两天在写爬虫程序,涉及英文文本处理,需要规范化英文标点符号的写法.正常情况下,英文句号「.」后面需要保证有且只有一个空格,但也有例外情况,比如「i.e.」.「e.g.」.「P.S.」这种.由于无法预 ...
- C/的常用位运算符
双目运算符 位逻辑运算符 有6种位运算: & 与运算 | 或运算 ^ 异或运算 ! 非运算(求补) >> 右移运算 << 左移运算 与运算(&)双目运算.二个位 ...
- 042 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 04 案例演示while循环的使用——循环输出英文字母
042 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 04 案例演示while循环的使用--循环输出英文字母 本文知识点:案例演示while循环的使用2 ...