SpringCloudGateway是微服务中的一员,其结合注册中心的使用场景是比较常见的,比如在统一鉴权方面,一般是向网关发起访问某个服务的请求,网关校验客户端是否登录,验证通过才向目标服务发起调用,目标服务的地址是从注册中心获取,而不是通过配置文件或者java类配置了。
1. 配置Eureka服务端:
引入eureka-server
dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
配置yml文件:
server:
port: 8765
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
spring:
application:
name: eureka-server
启动eureka服务:
@SpringBootApplication
@EnableEurekaServer
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
2.配置目标服务
引入jar:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
配置yaml文件:
server:
port: 8768
spring:
application:
name: backend-service
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8765/eureka/
启动服务,修改上面port,可以同时启动多个服务
@RestController
@SpringBootApplication
@EnableEurekaClient
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@GetMapping("/getInfo")
public String getInfo(){
int port = httpRequest.getLocalPort();
System.out.println("访问的端口:" + port);
// 每个服务启动端口不一致,用来做测试
return "hello:" + port;
}
}
3.配置gateway
引入jar:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 如果是编译的gateway源码,则不需要引入下面gateway jar -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
配置yaml文件:
server:
port: 8081
spring:
application:
name: spring-cloud-gateway-sample
cloud:
gateway:
discovery:
locator:
enabled: true #开启服务注册发现,这时
lowerCaseServiceId: true
eureka:
client:
service-url:
defaultZone: http://localhost:8765/eureka/
启动gateway
@SpringBootApplication
@EnableEurekaClient
public class GatewaySampleApplication {
public static void main(String[] args) {
SpringApplication.run(GatewaySampleApplication.class, args);
}
}
到这里我们已经把服务都起来了,假如我启动了三个目标服务器,端口分别为8768,8769,8770,则可以访问eureka-server,看到注册的服务:
浏览器访问http://localhost:8765/,页面如下:
访问gateway三次,则可以看到每次返回的端口信息不一样,看这里应该是用了轮询算法。