第九天:浪迹天涯网上商城(1.0版本)--商品服务中心-基于spring cloud + spring boot + swagger

1、需求

我们都知道项目中的服务是越来越多的,我们必须要把这些服务拆分,面向SOA,降低项目的耦合度。

2、实现步骤

1、创建一个项目langjitianya-itemservice

2、准备好pom.xml文件

3、准备好配置文件

4、准备好启动类

5、run 起来

6、访问验证

3、具体实现

1、项目结构简图

第一部分:内部api接口层。

第二部分:内部api接口实现层。

第三部分:暴露出去的服务接口层。

第四部分:暴露出去的服务接口实现层。

2、pom配置文件

第一部分:内部api接口层pom文件。


第二部分:内部api接口实现层pom文件。

        <groupId>com.niepengfei.langjitianya</groupId>
	<artifactId>langjitianya-itemservice-provider</artifactId>
	<version>1.0.0-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>langjitianya-itemservice-provider</name>
	<description>浪迹天涯商城商品服务实现</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.12.RELEASE</version>
		<relativePath/>
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<mybatis.version>3.2.8</mybatis.version>
		<mybatis.spring.version>1.2.2</mybatis.spring.version>
		<mybatis.paginator.version>1.2.15</mybatis.paginator.version>
		<pagehelper.version>3.4.2</pagehelper.version>
		<spring.version>4.3.10.RELEASE</spring.version>
		<langjitianya-itemservice-api.version>1.0.0-SNAPSHOT</langjitianya-itemservice-api.version>
		<mysql.version>5.1.32</mysql.version>
		<druid.version>1.0.9</druid.version>
		<spring.mybatis.version>1.3.1</spring.mybatis.version>
		<langjitianya-common.version>1.0.0-SNAPSHOT</langjitianya-common.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>com.niepengfei.langjitianya</groupId>
			<artifactId>langjitianya-common</artifactId>
			<version>${langjitianya-common.version}</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>${mysql.version}</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>${druid.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>com.niepengfei.langjitianya</groupId>
			<artifactId>langjitianya-itemservice-api</artifactId>
			<version>${langjitianya-itemservice-api.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aspects</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>com.github.miemiedev</groupId>
			<artifactId>mybatis-paginator</artifactId>
			<version>${mybatis.paginator.version}</version>
		</dependency>
		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper</artifactId>
			<version>${pagehelper.version}</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>${mybatis.version}</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>${spring.mybatis.version}</version>
		</dependency>
	</dependencies>

	<build>
		<resources>
			<resource>
				<directory>src/main/java</directory>
				<includes>
					<include>**/*.xml</include>
				</includes>
			</resource>
		</resources>
	</build>

第三部分:暴露出去的服务接口层pom文件。

   <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.12.RELEASE</version>
        <relativePath/>
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <packaging>jar</packaging>
    <version>1.0.0-SNAPSHOT</version>
    <groupId>com.niepengfei.langjitianya</groupId>
    <artifactId>langjitianya-itemservice-share-api</artifactId>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <swagger.version>2.2.2</swagger.version>
        <langjitianya-common.version>1.0.0-SNAPSHOT</langjitianya-common.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>${swagger.version}</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>${swagger.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.niepengfei.langjitianya</groupId>
            <artifactId>langjitianya-common</artifactId>
            <version>${langjitianya-common.version}</version>
        </dependency>
    </dependencies>

很清楚的可以看到,我们在这里整合了swagger。

第四部分:暴露出去的服务接口实现层pom文件。

        <groupId>com.niepengfei.langjitianya</groupId>
	<artifactId>langjitianya-itemservice-web</artifactId>
	<version>1.0.0-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>langjitianya-itemservice-web</name>
	<description>浪迹天涯商城商品服务提供给外部服务</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.12.RELEASE</version>
		<relativePath/>
	</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>Edgware.SR3</spring-cloud.version>
		<swagger.version>2.2.2</swagger.version>
		<langjitianya-itemservice-provider.version>1.0.0-SNAPSHOT</langjitianya-itemservice-provider.version>
		<langjitianya-itemservice-share-api.version>1.0.0-SNAPSHOT</langjitianya-itemservice-share-api.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-config-client</artifactId>
		</dependency>
		<!--如果由于网络抖动等原因导致config-client在启动时候访问config-server没有访问成功从而报错,
        这显然是不划算的,遇到这种情况我们希望config-client最好能重试几次,重试机制在这里也是受支持的,
        添加重试机制的方式很简单,引入如下两个依赖,引入依赖就OK了,不用做任何额外配置(当然要确保失败快速响应已开启)-->
		<dependency>
			<groupId>org.springframework.retry</groupId>
			<artifactId>spring-retry</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-aop</artifactId>
		</dependency>
		<!--有的时候,我动态的更新了Git仓库中的配置文件,那么我如何让客户端能够及时感知到呢?
        方式很简单,首先添加如下依赖,该依赖中包含了/refresh端点的实现,我们将利用这个端点来刷新配置信息。
        然后需要在application.properties中配置忽略权限拦截:
        management.security.enabled=false -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger2</artifactId>
			<version>${swagger.version}</version>
		</dependency>
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger-ui</artifactId>
			<version>${swagger.version}</version>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>com.niepengfei.langjitianya</groupId>
			<artifactId>langjitianya-itemservice-provider</artifactId>
			<version>${langjitianya-itemservice-provider.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</artifactId>
		</dependency>
		<dependency>
			<groupId>com.niepengfei.langjitianya</groupId>
			<artifactId>langjitianya-itemservice-share-api</artifactId>
			<version>1.0.0-SNAPSHOT</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>
		</dependencies>
	</dependencyManagement>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<mainClass>com.niepengfei.langjitianya.itemservice.web.App</mainClass>
				</configuration>
				<executions>
					<execution>
						<goals>
							<goal>repackage</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

	<repositories>
		<repository>
			<id>spring-snapshots</id>
			<name>Spring Snapshots</name>
			<url>https://repo.spring.io/snapshot</url>
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
		</repository>
		<repository>
			<id>spring-milestones</id>
			<name>Spring Milestones</name>
			<url>https://repo.spring.io/milestone</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
	</repositories>

3、配置文件

第一部分:内部api接口层。

无配置文件。

第二部分:内部api接口实现层。

无配置文件。

第三部分:暴露出去的服务接口层。

无配置文件。

第四部分:暴露出去的服务接口实现层。


(1). bootstrap.properties

# spring.cloud.config 服务的名字, 这个决定了我们要去配置中心获取哪些配置
spring.cloud.config.name=langjitianya-itemservice-jdbc,langjitianya-itemservice-validation-message

#读取的spring cloud config的环境
spring.cloud.config.profile=dev

# spring.cloud.config Git 分支
spring.cloud.config.label=master

####和重试机制相关的配置有如下四个
# 配置重试次数,默认为6
spring.cloud.config.retry.max-attempts=6

# 间隔乘数,默认1.1
spring.cloud.config.retry.multiplier=1.1

# 初始重试间隔时间,默认1000ms
spring.cloud.config.retry.initial-interval=1000

# 最大间隔时间,默认2000ms
spring.cloud.config.retry.max-interval=2000

# 快速失败
spring.cloud.config.fail-fast=false


# 开启Config服务发现支持,开启通过服务来访问Config Server的功能
spring.cloud.config.discovery.enabled=true

# 此处需要设置成Config Server在Eureka上注册的服务名
spring.cloud.config.discovery.serviceId=langjitianya-configuration

# 指定服务发现中心
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

(2). application.properties

#服务启动的端口号
server.port=50000

#应用名称
spring.application.name=langjitianya-itemservice

#运行环境
spring.profiles.active=dev

(3). dataSource.xml配置

       <aop:aspectj-autoproxy proxy-target-class="false"/>

	<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>

	<tx:annotation-driven transaction-manager="txManager" />

	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
		<property name="url" value="${itemcenter.jdbc.url}" />
		<property name="username" value="${itemcenter.jdbc.username}" />
		<property name="password" value="${itemcenter.jdbc.password}" />
		<property name="driverClassName" value="${itemcenter.jdbc.driver}" />
		<property name="maxActive" value="10" />
		<property name="minIdle" value="5" />
	</bean>

	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="configLocation" value="classpath:config/mybatis/mybatisConfig.xml"/>
		<property name="dataSource" ref="dataSource"/>
	</bean>

(4). mybatisConfig.xml配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	
	<plugins>
		<plugin interceptor="com.github.pagehelper.PageHelper">
        	<property name="dialect" value="mysql"/>
		</plugin>
	</plugins>

</configuration>

4、启动类


5、run

运行程序的顺序请看 README.md。运行结果失败了,抛出如下异常:


分析:从第一处我们可以看到,langjitianya-itemservice从8700端口获取配置信息,这是没有问题的。但是获取完配置信息后,langjitianya-itemservice还是从8700端口启动langjitianya-itemservice的服务,因为8700端口已经被配置中心服务所占用,所以langjitianya-itemservice启动的时候,就抛出 Address already in use: bind 的异常。可是我们明明在application.properties配置文件中指明了server.port=50000, 为什么程序不按照我们指定的端口启动服务呢?为了解决这个问题,我查阅了大量的资料,我很沮丧,网上的那些讲解spring cloud config的博客都是千篇一律,都是抄来抄去。什么有用的价值信息也没有。哎,中国人啊,一点知识版权也没有,没有办法,我没有这个问题折腾了很久很久,最后只能慢慢的debug阅读源代码。终于解决了,具体如何解决的请看下篇文章。

猜你喜欢

转载自blog.csdn.net/pfnie/article/details/80712378
今日推荐