Springboot整合springcloud实现分布式服务 简单demo 完整示例
Springboot整合springcloud实现分布式服务
一:创建一个maven项目作为父工程,管理依赖版本
<groupId>com.springcloud</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> |
父工程的pom文件如下
<?xml version="1.0" encoding="UTF-8"?> <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>
<groupId>com.springcloud</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging>
<modules> <module>../register-center</module> <module>../provider</module> <module>../consumer</module> </modules>
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.7.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
<properties> <java.version>1.8</java.version> <guli.version>0.0.1-SNAPSHOT</guli.version> <mybatis-plus.version>3.0.5</mybatis-plus.version> <velocity.version>2.0</velocity.version> <swagger.version>2.7.0</swagger.version> <!--<poi.version>3.9</poi.version>--> </properties>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies>
<!--<!–xls–>--> <!--<dependency>--> <!--<groupId>org.apache.poi</groupId>--> <!--<artifactId>poi</artifactId>--> <!--<version>${poi.version}</version>--> <!--</dependency>--> <!--<!–xlsx–>--> <!--<dependency>--> <!--<groupId>org.apache.poi</groupId>--> <!--<artifactId>poi-ooxml</artifactId>--> <!--<version>${poi.version}</version>--> <!--</dependency>-->
<!--swagger--> <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>
<!--mybatis-plus 持久层--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus.version}</version> </dependency>
<!-- velocity 模板引擎, Mybatis Plus 代码生成器需要 --> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>${velocity.version}</version> </dependency>
<!--Spring Cloud--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.SR2</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins>
<resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
</project> |
引入相关得到依赖并引入相关依赖的版本控制,让子类能有springboot-web的功能,并且引入了dpringvcoud的版本
接着创建注册中心
注册中心需要edueka组件,可以选择创建项目的时候添加,我这里选择手动添加
注册中心需要继承parent父工程
#服务端口 server.port=8002
#是否将自己注册到Eureka服务器中,本身是服务器,无需注册 eureka.client.register-with-eureka=false #是否从Eureka中获取注册信息 eureka.client.fetch-registry=false #Eureka客户端与Eureka服务端进行通信的地址 eureka.client.service-url.defaultZone=http://127.0.0.1:${server.port}/eureka/ |
启动注册中心,并访问
127.0.0.1:8002
注册中心搭建完成,接下来我们搭建消费端和提供端
首先搭建提供端
提供端的pom文件
<?xml version="1.0" encoding="UTF-8"?> <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.springcloud</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> </parent>
<groupId>com.springcloud</groupId> <artifactId>provider</artifactId> <version>0.0.1-SNAPSHOT</version> <name>provider</name> <description>Demo project for Spring Boot</description>
<properties> <java.version>1.8</java.version> </properties>
<dependencies> <!--服务注册--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
<!--mybatis-plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.0.5</version> </dependency>
<!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- velocity 模板引擎, Mybatis Plus 代码生成器需要 --> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> </dependency>
<!--swagger--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> </dependency>
<!--lombok用来简化实体类:需要安装lombok插件--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
</project> |
配置application.properties,在客户端微服务中添加注册Eureka服务的配置信息
# 服务端口 server.port=8001 # 服务名 spring.application.name=springcloud-provider
# 环境设置:dev、test、prod spring.profiles.active=dev
# mysql数据库连接 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://122.51.97.164:3306/jk?setUnicode=true&characterEncoding=utf8&useSSL=false spring.datasource.username=root spring.datasource.password=xxxx
#指定注册中心地址 eureka.client.service-url.defaultZone=http://127.0.0.1:8002/eureka/ #eureka服务器上获取的是服务器的ip地址,否则是主机名 eureka.instance.prefer-ip-address=true |
我们这里只是为了实现分布式的效果所以在项目中没有具体的业务逻辑,知识在提供段返回一个string就可以,不过为了springboot的自动扫描功能,会扫描项目的db连接,我们在这里加上了数据库配置,其实也可以在启动类中排序db的扫描也可以。
在客户端微服务启动类中添加注解
@EnableEurekaClient
我们在这里的controller中只返回一个string,具体业务的话可以自己实现。我们这里只展示分布式的效果。
Autowired private BookService bookService; @GetMapping("/book") public String getAllBookInfo(){ return "123"; } |
Controller中的简单代码
启动服务,在监控中心查看服务
然后创建消费端consumer
<?xml version="1.0" encoding="UTF-8"?> <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.springcloud</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> </parent> <groupId>com.springcloud</groupId> <artifactId>consumer</artifactId> <version>0.0.1-SNAPSHOT</version> <name>consumer</name> <description>Demo project for Spring Boot</description>
<properties> <java.version>1.8</java.version> </properties>
<dependencies>
<!--服务注册--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
<!--mybatis-plus--> <!--<dependency>--> <!--<groupId>com.baomidou</groupId>--> <!--<artifactId>mybatis-plus-boot-starter</artifactId>--> <!--<version>3.0.5</version>--> <!--</dependency>-->
<!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- velocity 模板引擎, Mybatis Plus 代码生成器需要 --> <!--<dependency>--> <!--<groupId>org.apache.velocity</groupId>--> <!--<artifactId>velocity-engine-core</artifactId>--> <!--</dependency>-->
<!--swagger--> <!--<dependency>--> <!--<groupId>io.springfox</groupId>--> <!--<artifactId>springfox-swagger2</artifactId>--> <!--</dependency>--> <!--<dependency>--> <!--<groupId>io.springfox</groupId>--> <!--<artifactId>springfox-swagger-ui</artifactId>--> <!--</dependency>-->
<!--lombok用来简化实体类:需要安装lombok插件--> <!--<dependency>--> <!--<groupId>org.projectlombok</groupId>--> <!--<artifactId>lombok</artifactId>--> <!--</dependency>-->
<!--服务调用--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
</project> |
在consumer启动类上加上注解
@EnableFeignClients
消费端的配置文件,其实没什么用
# 服务端口 server.port=8004 # 服务名 spring.application.name=springcloud-consumer
# 环境设置:dev、test、prod spring.profiles.active=dev
# mysql数据库连接 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://122.51.97.164:3306/jk?setUnicode=true&characterEncoding=utf8&useSSL=false spring.datasource.username=root spring.datasource.password=xxxx
#mybatis日志 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#返回json的全局时间格式 spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zone=GMT+8
#配置mapper xml文件的路径 mybatis-plus.mapper-locations=classpath:com/online/edu/eduservice/mapper/xml/*.xml
#指定注册中心地址 eureka.client.service-url.defaultZone=http://127.0.0.1:8002/eureka/ #eureka服务器上获取的是服务器的ip地址,否则是主机名 eureka.instance.prefer-ip-address=true |
创建包和接口
创建client包
@FeignClient注解用于指定从哪个服务中调用功能 ,名称与被调用的服务名保持一致。
@GetMapping注解用于对被调用的微服务进行地址映射。
@PathVariable注解一定要指定参数名称,否则出错
@RequestParam注解一定要指定参数名称,否则出错
@Component注解防止,在其他位置注入CodClient时idea报错
package com.guli.edu.client;
@FeignClient("guli-vod") @Component public interface VodClient { @DeleteMapping(value = "/admin/vod/video/{videoId}") public R removeVideo(@PathVariable("videoId") String videoId); } |
@Component @FeignClient("xueyuan-vidservice") public interface VidClient { //定义调用的方法 //方法调用路径 @DeleteMapping("/vidservice/vod/{videoId}") public R removeVideoAliyunId(@PathVariable("videoId") String videoId);
//定义调用删除多个视频的方法 @DeleteMapping("/vidservice/vod/removeMoreVideo") public R removeMoreVideoAlihyun(@RequestParam("videoList") List videoList); } |
调用微服务
我们这里只是为了演示效果,所以直接在controller里面演示效果了
@Autowired private BookClient bookClient;
@GetMapping("/get") public String getinfo(){ String allBookInfo = bookClient.getAllBookInfo(); return allBookInfo;
} |
测试效果
启动消费端
在注册中心查看
然后访问
获取到提供端的数据。
完整的代码在github上