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。运行结果失败了,抛出如下异常: