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网关相关推荐

  1. Consul 服务注册中心

    Consul 服务注册中心 Consul 是什么? Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发. 提供了微服务系统中的服务治理.配置中心.控 ...

  2. consul服务注册中心

    一.consul 服务注册中心 官网地址:https://www.consul.io/ Consul 是 HashiCorp 公司推出的开源产品,用于实现分布式系统的服务发现.服务隔离.服务配置,这些 ...

  3. SpringCloud 搭建服务注册中心

    SpringCloud 搭建服务注册中心 原创 作者 | 于海东 之前在巧玩SpringBoot--SpringBoot的第一个"Hello World!"(https://blo ...

  4. 如何使用 SpringCloud 搭建服务注册中心?

    作者 | 于海东 责编 | 郭   芮 之前在巧玩SpringBoot--SpringBoot的第一个"Hello World!"(https://blog.csdn.net/do ...

  5. 微服务 - Consul服务注册中心

    概述 上篇说到构建良好的架构,依托于基础设施建设(自动化测试.自动化部署.服务监控,服务发现.配置中心等等),决定成败的往往是基础设施建设,所以从搭建一个注册中心和配置中心开始我们新一阶段的启程. 注 ...

  6. SpringCloud微服务注册中心如何承载大型系统的千万级访问?源码及原理分析

    2019独角兽企业重金招聘Python工程师标准>>> 问题起源     Spring Cloud架构体系中,Eureka是一个至关重要的组件,它扮演着微服务注册中心的角色,所有的服 ...

  7. SpringCloud的服务注册中心(三) - 进一步了解 Eureka

    一.服务治理参与者 服务注册中心: eureka-server 服务提供者:HELLO-SERVICE 服务消费者 :HELLO-CONSUMER 很多时候,客户端既是服务提供者又是服务消费者,-&g ...

  8. SpringCloud Consul 服务注册与发现

    Consul 通过 Raft 协议实现强一致性, 通过 Agent 进行分布式健康检查,能够减少服务端的心跳检测压力. 相对 Eureka Server 这种集中式心跳检测机制,和采用 P2P 复制模 ...

  9. 教你一招如何使用几行代码实现zookeeper作为springcloud的服务注册中心

    如果没有安装过zookeeper,请移步 zookeeper的单机安装 - 详细教程:https://blog.csdn.net/Kevinnsm/article/details/116134397 ...

最新文章

  1. POJ2752KMP逆序处理
  2. 计算机工程毕业论文任务书,(计算机工程毕业设计论文任务书开题报告模板.doc...
  3. Linux下的Keyboard子系统
  4. php无限分类原理,php 递归无限级分类原理和实现代码
  5. 深度学习-人工神经网络概述
  6. 陆奇上任之后第二次面向媒体,针对阿波罗计划说了什么?
  7. 2018年90后薪资报告出炉:你在哪个级别???
  8. python安装whl_1 Matplotlib在win10下安装
  9. wpf menuitem 点击控件元素_一招教你如何在WPF界面开发时自定义外观,快来Get
  10. 征途猎魔mysql数据库_字典列表的拓展理解
  11. PAT乙级 1068 万绿丛中一点红 (20 分) Java 实现
  12. 跨站脚本攻击-----为什么要过滤危险字符串
  13. Golang bytes源码分析
  14. Ubports安装和使用gedit和ros等记录(仅供参考)
  15. 计算机cmos参数的设置,CMOS常见的设置方法
  16. jbmp.jar 下载地址
  17. 请问投稿中要求上传的author_SCI投稿中怎么上传稿件—Springer出版社杂志
  18. 【micropython】SPI触摸屏开发
  19. TP、TN、FP、FN解析
  20. pycaret的具体使用流程

热门文章

  1. (原创)c#学习笔记10--定义类成员03--接口的实现01--显示实现接口成员
  2. 解决Apache CXF 不支持传递java.sql.Timestamp和java.util.HashMap类型问题
  3. Android中Broadcast
  4. 深入.NET DataTable
  5. 一次次小进步,从毕业开始,你到现在飞跃了几次了,程序人生也不容易?
  6. Using NUnit with Visual Studio 2005 Express Editions
  7. 荣耀30pro系统_荣耀30 pro:正式再见!
  8. 4 关卡编辑器_虚幻引擎4与生存游戏产生化学反应,超真实开放世界手游诞生
  9. java固定资产管理系统代码_Java 固定资产管理系统(课程设计)
  10. linux互斥锁和条件变量,如何理解互斥锁和条件变量?