上一篇:什么是微服务,为什么是微服务,什么是springCloud
上篇文章了解了微服务,这篇我们就是做简单实践,微服务是将不同业务放到不同服务中,然后各个服务间互相调用。一般我们都会借助maven来做项目搭建,通常我们都会使用父子工程来搭建一个框架,父工程主要来实现,统一管理所以子工程(子模块),以及相关版本统一管理和依赖,可以统一编译;
一、简单了解maven父子工程
父子工程主要是利用了maven的继承,依赖传递为我们省去了一些重复配置,通常统一的配置都会在父工程中,为子模块提供使用,这样就不需要每个子模块都去做配置。其实在这个过程中也有很多小伙伴会有一些疑问,例如我们用一个项目打成jar的方式让其他模块引用,这样在这个jar中做依赖统一管理,但是在maven中由于非compile范围的依赖信息是不能传递的,所以有些工程就需要对这些不能传递的重新配置,这样就做不到统一管理;这时候假如说我们需要对平台某一个功能升级恰好就需要升级这个相关的版本,这时候只升级jar中的版本后其他项目存在的就不会生效(这主要是由于maven的两大依赖原则:第一声明者优先、路径近者优先;也就是说自己项目中的版本要比依赖jar中的版本优先),在接下来的搭建过程中会标记具体实现。
- 可继承元素有:groupId、version、description、url、inceptionYear、organization、licenses、developers、contributors、mailingLists、scm、issueManagement、ciManagement、properties、dependencyManagement、dependencies、repositories、pluginRepositories、build、reporting、profiles
- 不可继承元素有:artifactId、name、prerequisites
二、搭建简单的springCloud框架之旅
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
<spring-boot.version>2.3.0.RELEASE</spring-boot.version>
SpringBoot与SpringCloud的版本对应详细版,选择响应版本;不然到时候会有冲突;我们主要使用的是spring cloud的Hoxtonl版本
springCloud version(release) | spring boot version | Angel版本 | 兼容Spring Boot 1.2.x | Brixton版本 | 兼容Spring Boot 1.3.x,也兼容Spring Boot 1.4.x | Camden版本 | 兼容Spring Boot 1.4.x,也兼容Spring Boot 1.5.x | Dalston版本、Edgware版本 | 兼容Spring Boot 1.5.x,不兼容Spring Boot 2.0.x | Finchley版本 | 兼容Spring Boot 2.0.x,不兼容Spring Boot 1.5.x | Greenwich版本 | 兼容Spring Boot 2.1.x | Hoxtonl版本 | 兼容Spring Boot 2.2.x |
项目结构:
springcloud-demo? ? ? ? //父工程
|—springcloud-demo-api? ? ? ? //api公共管理工程
|—springcloud-demo-provider? ? ? ? //生产者
|—springcloud-demo-consumer? ? ? ? //消费者
?今天主要是创建空框架然后通过手动添加核心jar以及相关配置创建项目,后面主要是通过Spring Initializer初始化 (有机会的话可以聊聊通过Spring Initializer结合公司架构来生成框架的系统);
1.通过idea创建父工程:(图文结合说明)
创建maven工程-->配置pom
1.1创建maven工程:File—>new—>project;然后选择maven和要使用的jdk版本
1.2、 填写maven的坐标元素(GroupId、ArtifactId)
GroupId:是项目组织的唯一标识符,实际对应的java的包的结构,是main目录中java的目录结构。(命名规则:一般分多个段,第一段为域,第二段为公司名称。域又分为org,com,cn等,其中org为非盈利组织,com为商业组织)
ArtifactId:是项目的唯一标识符,实际对应项目名称,就是项目根目录的名称
?
1.3、配置pom(依赖统一管理)?
父工程我们一般不会写代码所以无关目录就可以删除掉例src
<?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.qizh.springclouddemo</groupId>
<artifactId>springcloud-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 修改打包方式 -->
<packaging>pom</packaging>
<!-- 统一jar包版本管理,properties标签中的标签可以随意定义,建议使用简单易读的单词 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<mysql.version>8.0.28</mysql.version>
<druid.version>1.1.10</druid.version>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
<spring-boot.version>2.3.0.RELEASE</spring-boot.version>
</properties>
<!-- 锁定jar包版本;因为是总项目,所以使用dependencyManagement来统一管理jar版本,这样子项目就可以直接使用了 -->
<dependencyManagement>
<dependencies>
<!--springcloud依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- springboot依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</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.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
</dependencyManagement>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
1.4、我们使用maven的继承就不得不说两个元素type和scope
type定义引入包的方式:默认是jar,还有war和pom;pom就是把很多jar包打包到一个pom中,我们依赖了pom,就可以下载所有的jar。
scope:控制dependency元素的使用范围
- compile(默认):被依赖的项目参与项目的编译,测试,打包,运行等阶段,打包通常会包含此依赖,是比较强的依赖
- provided:被依赖的项目参与项目编译,测试,运行阶段;在打包阶段相当于做了exclude操作。
- runtime:被依赖的项目不会参与到项目的编译,会参与到测试和运行阶段。
- test:被依赖的项目只参与到项目测试阶段
- system:与provided类似,但是该依赖不会从maven仓库中找,而是从本地系统中获取,通常和systemPath标签联合使用用来指定该依赖在项目中的位置
- import:只在dependencyManagement中,管理依赖包的版本,用来保持当前所有项目的所有依赖版本统一
2.创建第一个父工程下的子模块:(图文结合说明)
2.1、创建子模块springcloud-demo-api (一般用来存放公共实体类和一些工具类,让其他模块依赖后直接使用)
?右击父工程—>new—Module;然后选择maven和jdk版本
2.2、项目名称
?创建完成后我们可以在父pom.xml中看到:
<modules>
<module>springcloud-demo-api</module>
</modules>
2.3、编译项目看是否可以编译通过可使用maven相关的命令;????????
?3.创建生产者 springcloud-demo-provider?
3.1、创建省略:创建过程可参考2中的步骤;
3.2、配置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">
<parent>
<artifactId>springcloud-demo</artifactId>
<groupId>com.qizh.springclouddemo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-demo-provider</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!--mysql-connector-java-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
3.3、配置配置文件
springcloud-demo-provider/src/main/resources下添加/application.yml
server:
port: 8001 #服务端口
#spring相关配置
spring:
application:
name: springcloud-demo-provider #服务名
datasource:
type: com.alibaba.druid.pool.DruidDataSource #当前数据源操作类型
url: jdbc:mysql://localhost:3306/springclouddemo?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
username: root
password: root
#mybatis:配置
mybatis:
mapperLocations: classpath:mapper/*.xml
3.4、配置启动类
package com.qizh.springclouddemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @ProjectName: springclouddemo
* @ClassName: CloudDemoApplication
* @Description: 启动类
* @Author: 86157
* @Date: 2022/5/21 1:23
*/
@SpringBootApplication
public class CloudDemoApplication {
public static void main(String[] args) {
SpringApplication.run(CloudDemoApplication.class,args);
}
}
3.5、编写测试类
.
package com.qizh.springclouddemo.common.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @ProjectName: springclouddemo
* @ClassName: PingController
* @Description: 测试类
* @Author: 86157
* @Date: 2022/5/21 1:44
*/
@RestController
public class PingController {
@RequestMapping("ping")
public String ping(){
return "success";
}
}
3.6、启动访问?http://localhost:8001/ping?返回success代表成功
??我这里没有指定上下文所有默认是/;如果需要指定上下文则只需要在application.yml中增加配置;则访问http://localhost:8001/springcloud-demo-provider/ping
server:
servlet:
context-path: /springcloud-demo-provider
4.创建消费者springcloud-demo-consumer
创建过程和生产者类似,这个过程就不再重复展开了
pom.xml
<?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">
<parent>
<artifactId>springcloud-demo</artifactId>
<groupId>com.qizh.springclouddemo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-demo-consumer</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
application.yml
server:
port: 8002 #服务端口
servlet:
context-path: /springcloud-demo-consumer
#spring相关配置
spring:
application:
name: springcloud-demo-consumer #服务名
启动类:
package com.qizh.springclouddemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
/**
* @ProjectName: springclouddemo
* @ClassName: CloudDemoApplication
* @Description: 启动类
* @Author: 86157
* @Date: 2022/5/21 2:00
*/
@SpringBootApplication(scanBasePackages = {"com.qizh.springclouddemo"})
public class CloudDemoApplication {
public static void main(String[] args) {
SpringApplication.run(CloudDemoApplication.class,args);
}
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
测试类
package com.qizh.springclouddemo.common.controllers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @ProjectName: springclouddemo
* @ClassName: ConsumerController
* @Description: 消费者测试类
* @Author: 86157
* @Date: 2022/5/21 2:04
*/
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/consumer/ping")
public String ping(){
return restTemplate.getForObject("http://localhost:8001/springcloud-demo-provider/ping",String.class);
}
}
这次我们调用使用的是RestTemplate(后面我们会用到springCloud服务间调用组件OpenFeign来调用);所以需要把其在加载的时候注入到spring中ioc容器中,启动生产者和消费者访问消费者
http://localhost:8002/springcloud-demo-consumer/consumer/ping
?在整个过程中api没有使用;但是建立的原因是保证整个结构完整性,感兴趣的小伙伴可以尝试在此基础上扩充丰富的测试案例;
|