一、要达到的目的
我现在有两个业务项目shop-business,shop-user-center,我们用springboot实现后,访问的地址大概如下
shop-business: http://localhost:8091/shop-business/get/1
shop-user-center:http://localhost:8092/shop-user-center/get/1
那我们可不可以用网关统一一下访问方式呢?
比如:http://localhost:8007/shop-user-center/get/1,http://localhost:8007/shop-business/get/1

二、项目背景
1.注册中心:shop-eureka
2.网关:shop-gateway-spring-cloud
3.业务项目1:shop-user-center
4.业务项目2:shop-business

三、实现方法
1.shop-eureka
1.1 pom依赖

<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.3.0.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>
	<groupId>slan.air.shop</groupId>
	<artifactId>shop-eureka</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>shop-eureka</name>
	<description>shop-eureka</description>

	<properties>
		<java.version>1.8</java.version>
		<spring-cloud.version>Hoxton.SR4</spring-cloud.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>

	<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>

1.2 配置文件

server.port=8000
spring.application.name=shop-eureka

1.3 启动方法

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class ShopEurekaApplication {

	public static void main(String[] args) {
		SpringApplication.run(ShopEurekaApplication.class, args);
	}

}

2.shop-gateway-spring-cloud
2.1 pom依赖

	<modelVersion>4.0.0</modelVersion>
	<groupId>slan.air.shop</groupId>
	<artifactId>shop-gateway-spring-cloud</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>shop-gateway-spring-cloud</name>

 	<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    
     <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.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

    <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>

2.2 配置文件

server:
  port: 8007
  
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8000/eureka/
      
spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          lowerCaseServiceId: true  #这个配置是设置在URL请求是项目名称的字母使用小写,默认是大写

2.3 启动方法

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class CloudGatewayApp {

	public static void main(String[] args) {
		SpringApplication.run(CloudGatewayApp.class, args);
	}
}

3.shop-user-center
3.1 pom依赖

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.3.RELEASE</version>
		<relativePath />
	</parent>
	
	<groupId>slan.air.shop</groupId>
	<artifactId>shop-user-center</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>shop-user-center</name>
	<description>shop-user-center</description>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<java.version>1.8</java.version>
		<mybatis-spring-boot-starter.version>1.3.2</mybatis-spring-boot-starter.version>
		<apollo-client.version>1.4.0</apollo-client.version>
		<druid.version>1.1.10</druid.version>
		<mybatis-plus.version>2.3</mybatis-plus.version>
		<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			 <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>
		<dependency>
			 <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
		</dependency>

		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>${mybatis-spring-boot-starter.version}</version>
		</dependency>
	</dependencies>

	<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>
			<dependency>
				<groupId>com.google.guava</groupId>
				<artifactId>guava</artifactId>
				<version>20.0</version>
		    </dependency>
		</dependencies>
	</dependencyManagement>

3.2 配置文件

server.port=8002
spring.application.name=shop-user-center

eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8000/eureka/

3.3 启动方法

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableEurekaClient
public class ShopUserCenterApplication {

	public static void main(String[] args) {
		SpringApplication.run(ShopUserCenterApplication.class, args);
	}

}

3.4测试接口

@Api(value = "用户信息管理")
@RestController
public class UserController {
	
	@ApiOperation(value = "获取用户详细信息", notes="获取用户详细信息")
	@ApiImplicitParam(name = "id", value = "用户ID", paramType = "path", required = true, dataType = "Integer")
	@RequestMapping(value = "/get/{id}" ,method = RequestMethod.GET)
	public String getUser(@PathVariable Integer id) {
		try {
			System.out.println("---获取用户详细信息----" + id);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		return "用户详情:"+id;
	}
}

4.shop-business
4.1 pom依赖

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.3.RELEASE</version>
		<relativePath />
	</parent>
	
	<groupId>slan.air.shop</groupId>
	<artifactId>shop-business</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>shop-business</name>
	<description>shop-business</description>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<java.version>1.8</java.version>
		<mybatis-spring-boot-starter.version>1.3.2</mybatis-spring-boot-starter.version>
		<apollo-client.version>1.4.0</apollo-client.version>
		<druid.version>1.1.10</druid.version>
		<mybatis-plus.version>2.3</mybatis-plus.version>
		<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			 <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>
		<dependency>
			 <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
		</dependency>

		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>${mybatis-spring-boot-starter.version}</version>
		</dependency>
	</dependencies>

	<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>
			<dependency>
				<groupId>com.google.guava</groupId>
				<artifactId>guava</artifactId>
				<version>20.0</version>
		    </dependency>
		</dependencies>
	</dependencyManagement>

4.2 配置文件

server.port=8013
spring.application.name=shop-business
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8000/eureka/

4.3 启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableEurekaClient
public class ShopBusinessApplication {

	public static void main(String[] args) {
		SpringApplication.run(ShopBusinessApplication.class, args);
	}

}

4.4测试接口

@RestController
public class OrderController {
	@ApiOperation(value = "商品详情", httpMethod = "GET")
	@RequestMapping(value="/get/{id}", method = RequestMethod.GET)
	public String get(@PathVariable String id) {
		try {
			System.out.println(LocalTime.now()+"---商品详情---"+us);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "商品详情:"+id;
	}
}

四、测试情况
1.shop-business:http://localhost:8007/shop-business/get/1
在这里插入图片描述
2.shop-user-center:http://localhost:8007/shop-user-center/get/1
在这里插入图片描述

通过上面的测试图片可以看出,两个项目都是通过网关的端口8007进行访问,基本上满足了我们的需求。

五、问题
1.http://localhost:8081/shop-user-center/get/1中的shop-user-center太长了能改成http://localhost:8081/user/get/1吗?
spring cloud gateway 的filters应该可实现,后面再添加。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐