在微服务应用中,不管config配置中心,consul注册中,都是在集群内部进行访问。那么对外访问时,微服务也需要相应的机制提供api接口。Getway服务网关就是提供该机制的应用服务。在spring cloud中apiGetway主要功能如下:
● 对外提供服务接口
● 对内根据逻辑调用内部多个接口,进行信息聚合返回给调用者
● 异步调用无需等待反馈的服务
在这里,我们采用spring cloud的zuul做服务网关。具体实现方法,如下:
1.环境:
consul正常运行
rabbitmq正常运行
jdk1.8
上一节中second-consul-config-server服务正常运行
2.创建getway项目, second-consul-getway。
1)新建second-consul-getway maven工程,其中pom如下:
<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>
<parent>
<groupId>com.fiberhome</groupId>
<artifactId>second-fiberhome</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>second-consul-getway</artifactId>
<packaging>jar</packaging>
<name>second-consul-getway</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-consul-dependencies</artifactId>
<version>1.0.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
在工程中引用了spring-cloud-starter-zuul依赖。
2)创建application.properties
server.port=8080
spring.application.name=first-getway
spring.cloud.consul.host=192.168.56.101
spring.cloud.consul.port=8500
spring.cloud.consul.enabled=true
spring.cloud.consul.discovery.serviceName=getway
spring.cloud.consul.discovery.register=true
spring.cloud.consul.discovery.healthCheckUrl=http://192.168.56.1:8080/health
spring.cloud.consul.discovery.healthCheckInterval=10s
spring.cloud.consul.discovery.tags=dev
spring.cloud.consul.discovery.enabled=true
spring.cloud.consul.discovery.port=${server.port}
zuul.routes.api-a.path=/second-client/**
zuul.routes.api-a.service-id=second-client
其中
zuul.routes.api-a.path=/second-client/**
zuul.routes.api-a.service-id=second-client
是配置服务网关关联的后台服务,通过consul注册中的second-client进行对接,实现服务的路由功能。
3)创建ConsulGetwayApplication.java
package com.fiberhome;
import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@EnableZuulProxy
@SpringCloudApplication
public class ConsulGetwayApplication
{
public static void main( String[] args )
{
SpringApplication.run(ConsulGetwayApplication.class, args);
}
}
通过@EnableZuulProxy,实现服务网关注解。
3.创建服务网关client工程,second-consul-getway-client。
1)新建second-consul-getway-client maven工程,其中pom如下:
<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>
<parent>
<groupId>com.fiberhome</groupId>
<artifactId>second-fiberhome</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>second-consul-getway-client</artifactId>
<packaging>jar</packaging>
<name>second-consul-getway-client</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-consul-dependencies</artifactId>
<version>1.0.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
使用的依赖和其他工程没有多大变化。
2)创建application.properties
server.port=9977
#config
spring.application.name=second-config
spring.cloud.config.profile=dev
#spring.cloud.config.label=master
spring.cloud.config.uri=http://127.0.0.1:8888/
#spring.cloud.config.failFast=true
spring.cloud.consul.host=192.168.56.101
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.enabled=true
spring.cloud.consul.discovery.serviceName=second-client
spring.cloud.consul.discovery.healthCheckUrl=http://192.168.56.1:${server.port}/health
spring.cloud.consul.discovery.healthCheckInterval=10s
spring.cloud.consul.discovery.tags=dev
spring.cloud.consul.discovery.port=${server.port}
#rabbitmq
spring.rabbitmq.host=192.168.56.101
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbiymq.password=guest
spring.cloud.bus.trace.enabled=true
其中spring.cloud.consul.discovery.serviceName=second-client对应的getway服务中的路由名称。
3)创建ConsulGetwayClientApplication.java启动类和VersionController.java配置信息访问类。
ConsulGetwayClientApplication.java
package com.fiberhome;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class ConsulGetwayClientApplication
{
public static void main( String[] args )
{
SpringApplication.run(ConsulGetwayClientApplication.class, args);
}
}
VersionController.java
package com.fiberhome.web;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RefreshScope
@RestController
public class VersionController {
@Value("${version}")
private String version;
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
@RequestMapping(value = "/version", method = RequestMethod.GET)
public String version() {
return this.version;
}
}
4.启动服务
second-consul-getway
second-consul-getway-client
consul结果:
通过服务网关访问client端version值
由此,可以发现通过服务网关能够访问到client的值。
该工程源码见github:https://github.com/moyu2012/second-fiberhome