SpringCloud——Maven方式创建微服务项目(如何分别打包启动)、公共模块如何创建和引入以及如何远程调用(Feign)
SpringCloud依靠maven手动搭建一、创建父工程1.1 创建服务1(service1)1.2 创建服务2(service2)二、maven子模块打包2.1 打包命令2.2 执行命令2.3 可能出现的问题三、公共模块的创建和引入3.1 创建功能模块3.2 引入方式一、创建父工程先创建一个最普通不过的maven项目:IDEA:File ——》 new project ——》 左侧选择mave
SpringCloud依靠maven手动搭建
一、创建父工程
- 先创建一个最普通不过的maven项目:
IDEA:File ——》 new project ——》 左侧选择maven方式构建(以后也可以选择Spring Inktializr方式后面我会补充),点击next ——》 输入你的项目名称(groupId的意思就是跟你或者公司或者项目的身份有关的一个信息,看个人),点击Finish。一个最普通的jave项目就创建成功。
创建成功后
- 在父工程的pom.xml中添加SpringCloud项目所需依赖
注意版本对应
如果pom显示红色,说明包没拉下来,尝试手动输入包名让idea自己拉
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
引入后记得更新下jar包,确保都拉下来了
之后可以把父工程src文件夹删掉
1.1 创建服务1(service1)
- 选中父项目,右键选择new Module——》还是选择maven方式,选中父工程,输入子模块 服务1(service1) 的名称,点击Finish。
- 回顾父工程的pom,子模块的引用添加上了
多出了子模块相关的内容
<modules>
<module>service1</module>
</modules>
- 同样在service的pom里面也有父模块的相关引用,按住control可以用鼠标点过去
<parent>
<artifactId>springCloud-demo</artifactId>
<groupId>org.sfrj</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
- 添加依赖(包含nacos,因为微服务项目为了方便配置一版是需要一个注册中心的,不然后期大量的配置一改就要重启项目非常不方便,这里只使用nacos作为注册中心,可以通过图形化界面查看具体的情况,下载和启动也很简单)
<dependencies>
<!--读取nacos配置-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--web项目-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--注册服务-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--不同服务间通过Feign调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
- service1作为子项目其实就是一个springboot项目,相关的依赖都有了,现在需要一个启动类
@SpringBootApplication
@RefreshScope
@EnableDiscoveryClient
@EnableFeignClients
public class Service1ManageApplication {
public static void main(String[] args) {
SpringApplication.run(Service1ManageApplication.class, args);
}
}
- 添加配置文件,这里内容是跟nacos有关的,nacos不是本文章的重点,所以后面的配置被我覆盖掉,具体可以查看另一篇文章 TODO:
server:
port: 56010 #启动端口 命令行注入
spring:
application:
name: service1
# cloud:
# nacos:
# discovery:
# server-addr: 127.0.0.1:8848 # 配置中心地址
# namespace: 583ee47f-6090-41c3-af77-2c792c2fa17a # 开发环境
# config:
# server-addr: 127.0.0.1:8848 # 配置中心地址
# file‐extension: yaml # 文件拓展名 application:name + file‐extension就是groupId:service1.yaml
# namespace: 583ee47f-6090-41c3-af77-2c792c2fa17a # 开发环境
# group: TEST_GROUP # 测试组
- 添加一个controller,并启动项目
@RestController
public class Service1Controller {
@GetMapping(value = "/configs")
public String getConfigs() {
return "服务1";
}
}
启动项目
1.2 创建服务2(service2)
按照相同的步骤创建service2,这里就不重复了,pom依赖一样,出来配置文件的端口必须换一个,然后对应controller的返回内容换一下,其它的都类似。
最终的目录结构是这样的,这样就有了两个服务了service1,service2(端口是56020)
访问:http://localhost:56010/configs 得到 :服务1(看你自己写的什么)
访问:http://localhost:56020/configs2 得到 : config2(看你自己写的什么)
二、maven子模块打包
2.1 打包命令
- 打包前,在service的pom文件中添加如下依赖
子应用打包,打Jar包时会引入依赖包,会打包成一个可以直接运行的 JAR 文件,使用“Java -jar”命令就可以直接运行
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.3.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
可以在idea下方的terminal中,进入service1文件夹下(cd service1),然后输入下面的命令
mvn clean package
打包成功如下图,在对应的目录下面会生产target目录和一些class文件,以及最重要的service1.jar文件
2.2 执行命令
- 首先确保不会有相同的端口应用已经启动了
java -jar service1.jar
启动成功
2.3 可能出现的问题
org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length = 1
idea的编码不对,配置文件有中文
解决办法
启动时加上
java -Dfile.encoding=utf-8 -jar service1.jar
三、公共模块的创建和引入
假如我们有一种场景,比如项目里面经常会用到SysUser这张表,service1和service2是分开的,service1是无法访问service2里面的类的,一种方法是service1和service2都写一遍SysUser这个类,很明显,当服务多了之后,SysUser只要有一点变化,所有服务中的类都要改变。这是不利于正常开发的。
3.1 创建功能模块
- 还是点击父工程 ——》右键,新建module ——》还是maven项目 ——》 输入相关信息
- 创建一个SysUser类
public class SysUser {
public SysUser(String name) {
this.name = name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "SysUser{" +
"name='" + name + '\'' +
'}';
}
}
3.2 引入方式
进入到service1的pom(其中一个服务当中)
<!--引入公共模块-->
<dependency>
<groupId>org.sfrj</groupId>
<artifactId>common-module</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
原来在service1中是无法写SysUser类的,现在可以试一试,IDEA就会有相关的提示了。
建议:依赖的提示最好直接打,当你打common-的时候,IDEA的提示就已经很精确了,一直Enter就行。
四、Feign远程调用
有时候可能会有一个服务调用另一个服务请求的情况,比如service2获取一些service1的一些数据,但是service2又不能直接引用service1的代码;
下面是service2如何调用service1的接口
4.1 创建一个接口类Service1Client
@FeignClient(name = "service1")
public interface Service1Client {
/**
* 获取服务1的接口
* @return 字符串
*/
@GetMapping("/configs")
String getConfigs();
}
并用Service1Client 注解,name就是service1配置文件中的应用的名称
这个接口中的getConfigs方法就是service1中对应有一个请求下的地址是localhost:56010/configs,所以可以直接调用这个方法来获取service1接口的信息。
- 在service2中的controller中添加如下代码
@Autowired
private Service1Client service1Client;
@GetMapping("/service1-config")
public String getConfigsFromService1(){
return "获取服务Service1-config内容" + service1Client.getConfigs();
}
然后启动service2(service1也要启动哦),浏览器访问对应地址,你会得到:
更多推荐
所有评论(0)