SpringCloud + Consul服务注册中心 + gateway网关
1 启动Consul
2 创建springcloud-consul项目及三个子模块
2.1 数据模块consul-producer
2.2 数据消费模块consul-consumer
2.3 gateway网关模块
3 测试及项目下载
1、首先安装Consul并启动Consul,端口号为8500
2、创建一个maven项目springcloud-consul,修改pom.xml添加SpringBoot及SpringCloud依赖(这里展示的是最后的pom.xml文件)
<?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>com.test</groupId><artifactId>springcloud-consul</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version><modules><module>consul-producer</module><module>consul-consumer</module><module>gateway-service</module></modules><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.4.RELEASE</version><relativePath/></parent><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Finchley.RELEASE</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter</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-consul-config</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
2.1 数据提供模块consul-producer
创建数据提供服务模块consul-producer,修改pom.xml增加依赖:
<?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"><parent><artifactId>springcloud-consul</artifactId><groupId>com.test</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>consul-producer</artifactId><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>4.3.1</version></dependency></dependencies></project>
配置文件application.yml文件为:
debug: falsespring.aop.auto: truespring:application:name: data-producercloud:consul:enabled: truehost: localhostport: 8500discovery:enabled: trueregister: true #是否将自身服务注册到consul中hostname: 127.0.0.1healthCheckPath: /actuator/health #服务健康检查地址healthCheckInterval: 15sserviceName: ${spring.application.name}tags: testinstanceId: ${spring.application.name}-${spring.cloud.client.ip-address}-${server.port} # 服务id
启动类DataProducerApplication
package com.test;import cn.hutool.core.convert.Convert; import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.NetUtil; import cn.hutool.core.util.NumberUtil; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import java.util.Scanner; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException;@EnableDiscoveryClient @SpringBootApplication @EnableAutoConfiguration public class DataProducerApplication {public static void main(String[] args) {int port = 0;int defaultPort = 8080;int time = 5;Future<Integer> future = ThreadUtil.execAsync(() ->{int p = defaultPort;System.out.println(String.format("请于%d秒钟内输入端口号, 推荐 8080 、 8081 或者 8082,超过%d秒将默认使用 %d", time, time, defaultPort));Scanner scanner = new Scanner(System.in);while(true) {String strPort = scanner.nextLine();if(!NumberUtil.isInteger(strPort)) {System.err.println("只能是数字");} else {p = Convert.toInt(strPort);scanner.close();break;}}return p;});try{port=future.get(time, TimeUnit.SECONDS);}catch (InterruptedException | ExecutionException | TimeoutException e){port = defaultPort;}if(!NetUtil.isUsableLocalPort(port)) {System.err.printf("端口%d被占用了,无法启动%n", port );System.exit(1);}new SpringApplicationBuilder(DataProducerApplication.class).properties("server.port=" + port).run(args);} }
DataController处理每一个请求
package com.test.controller;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;@RestController public class DataController {@RequestMapping("/*")public String get(HttpServletRequest request) {return String.format("实际响应地址:%s", request.getRequestURL().toString());} }
2.2 数据消费模块consul-consumer
使用LoadBalancerClient实现服务转发,即将服务映射到consul-producer服务
修改pom.xml增加依赖
<?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"><parent><artifactId>springcloud-consul</artifactId><groupId>com.test</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>consul-consumer</artifactId><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies></project>
配置文件application.yml
spring:application:name: data-consumercloud:consul:host: 127.0.0.1port: 8500discovery:register: truehostname: 127.0.0.1healthCheckPath: /actuator/health server:port: 8090data-producer: data-producer
启动类DataConsumerApplication
package com.test;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication @EnableDiscoveryClient public class DataConsumerApplication {public static void main(String[] args) {SpringApplication.run(DataConsumerApplication.class, args);} }
DataConsumerController处理请求
package com.test.controller;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate;import javax.servlet.http.HttpServletRequest;@RestController public class DataConsumerController {@Value("${data-producer}")private String dataProducer;@Autowiredprivate LoadBalancerClient loadBalancerClient;@RequestMapping("/data-api/**")public String test(HttpServletRequest request) {ServiceInstance serviceInstance = loadBalancerClient.choose(dataProducer);String result = new RestTemplate().getForObject(serviceInstance.getUri().toString() + request.getRequestURI().replace("data-api", ""),String.class);System.out.println(result);return result;} }
2.3 gateway网关实现服务转发
创建gateway-service模块,修改pom.xml增加gateway所需依赖
<?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"><parent><artifactId>springcloud-consul</artifactId><groupId>com.test</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>gateway-service</artifactId><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency></dependencies></project>
配置文件application.yml
server:port: 8100spring:application:name: gateway-servicecloud:gateway:routes:- id: data-service1 #请求 http://localhost:8100/data-service1/test会转发到data-producer服务,uri: lb://data-producer #在服务注册中心找服务名为 data-producer的服务, predicates:- Path=/data-service1/*filters:- StripPrefix=1- id: data-service2 # 请求 http://localhost:8100/data-service2/test转发到 http://localhost:8080/testuri: http://localhost:8080predicates:- Path=/data-service2/*filters:- StripPrefix=1 #前缀, 在当前路径匹配中表示去掉第一个前缀 /data-service2consul:enabled: truehost: localhostport: 8500discovery:enabled: trueregister: false #是否将自身服务注册到consul中hostname: 127.0.0.1healthCheckPath: /actuator/health #服务健康检查地址healthCheckInterval: 15sserviceName: ${spring.application.name}tags: testinstanceId: ${spring.application.name}-${spring.cloud.client.ip-address}-${server.port} # 服务id
启动类GatewayServiceApplication
package com.test;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication public class GatewayServiceApplication {public static void main(String[] args) {SpringApplication.run(GatewayServiceApplication.class, args);} }
3、测试及项目下载
首先启动consul,启动两个DataProducerApplication实例,端口号为8080、8081, 启动DataConsumerApplication及GatewayServiceApplication
DataConsumerApplication服务
在浏览器输入http://localhost:8090/data-api/test, 访问DataConsumerApplication服务,输出结果为: “实际响应地址:http://127.0.0.1:8081/test” 或 "实际响应地址:http://127.0.0.1:8080/test"
GatewayServiceApplication服务
转发格式见application.yml文件
在浏览器中输入http://localhost:8100/data-service1/test, 访问GatewayServiceApplication同样 可以看到 有时访问8080端口的DataProducerApplication服务,有时访问8081端口的DataProducerApplication服务
在浏览器中输入http://localhost:8100/data-service2/test, 实际响应的是8080端口的DataProducerApplication服务,
项目下载
转载于:https://www.cnblogs.com/wushengwuxi/p/11585567.html
SpringCloud + Consul服务注册中心 + gateway网关相关推荐
- Consul 服务注册中心
Consul 服务注册中心 Consul 是什么? Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发. 提供了微服务系统中的服务治理.配置中心.控 ...
- consul服务注册中心
一.consul 服务注册中心 官网地址:https://www.consul.io/ Consul 是 HashiCorp 公司推出的开源产品,用于实现分布式系统的服务发现.服务隔离.服务配置,这些 ...
- SpringCloud 搭建服务注册中心
SpringCloud 搭建服务注册中心 原创 作者 | 于海东 之前在巧玩SpringBoot--SpringBoot的第一个"Hello World!"(https://blo ...
- 如何使用 SpringCloud 搭建服务注册中心?
作者 | 于海东 责编 | 郭 芮 之前在巧玩SpringBoot--SpringBoot的第一个"Hello World!"(https://blog.csdn.net/do ...
- 微服务 - Consul服务注册中心
概述 上篇说到构建良好的架构,依托于基础设施建设(自动化测试.自动化部署.服务监控,服务发现.配置中心等等),决定成败的往往是基础设施建设,所以从搭建一个注册中心和配置中心开始我们新一阶段的启程. 注 ...
- SpringCloud微服务注册中心如何承载大型系统的千万级访问?源码及原理分析
2019独角兽企业重金招聘Python工程师标准>>> 问题起源 Spring Cloud架构体系中,Eureka是一个至关重要的组件,它扮演着微服务注册中心的角色,所有的服 ...
- SpringCloud的服务注册中心(三) - 进一步了解 Eureka
一.服务治理参与者 服务注册中心: eureka-server 服务提供者:HELLO-SERVICE 服务消费者 :HELLO-CONSUMER 很多时候,客户端既是服务提供者又是服务消费者,-&g ...
- SpringCloud Consul 服务注册与发现
Consul 通过 Raft 协议实现强一致性, 通过 Agent 进行分布式健康检查,能够减少服务端的心跳检测压力. 相对 Eureka Server 这种集中式心跳检测机制,和采用 P2P 复制模 ...
- 教你一招如何使用几行代码实现zookeeper作为springcloud的服务注册中心
如果没有安装过zookeeper,请移步 zookeeper的单机安装 - 详细教程:https://blog.csdn.net/Kevinnsm/article/details/116134397 ...
最新文章
- POJ2752KMP逆序处理
- 计算机工程毕业论文任务书,(计算机工程毕业设计论文任务书开题报告模板.doc...
- Linux下的Keyboard子系统
- php无限分类原理,php 递归无限级分类原理和实现代码
- 深度学习-人工神经网络概述
- 陆奇上任之后第二次面向媒体,针对阿波罗计划说了什么?
- 2018年90后薪资报告出炉:你在哪个级别???
- python安装whl_1 Matplotlib在win10下安装
- wpf menuitem 点击控件元素_一招教你如何在WPF界面开发时自定义外观,快来Get
- 征途猎魔mysql数据库_字典列表的拓展理解
- PAT乙级 1068 万绿丛中一点红 (20 分) Java 实现
- 跨站脚本攻击-----为什么要过滤危险字符串
- Golang bytes源码分析
- Ubports安装和使用gedit和ros等记录(仅供参考)
- 计算机cmos参数的设置,CMOS常见的设置方法
- jbmp.jar 下载地址
- 请问投稿中要求上传的author_SCI投稿中怎么上传稿件—Springer出版社杂志
- 【micropython】SPI触摸屏开发
- TP、TN、FP、FN解析
- pycaret的具体使用流程
热门文章
- (原创)c#学习笔记10--定义类成员03--接口的实现01--显示实现接口成员
- 解决Apache CXF 不支持传递java.sql.Timestamp和java.util.HashMap类型问题
- Android中Broadcast
- 深入.NET DataTable
- 一次次小进步,从毕业开始,你到现在飞跃了几次了,程序人生也不容易?
- Using NUnit with Visual Studio 2005 Express Editions
- 荣耀30pro系统_荣耀30 pro:正式再见!
- 4 关卡编辑器_虚幻引擎4与生存游戏产生化学反应,超真实开放世界手游诞生
- java固定资产管理系统代码_Java 固定资产管理系统(课程设计)
- linux互斥锁和条件变量,如何理解互斥锁和条件变量?