SpringCloud——Maven方式创建微服务项目(如何分别打包启动)、公共模块如何创建和引入以及如何远程调用(Feign)

一、创建父工程

  • 先创建一个最普通不过的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也要启动哦),浏览器访问对应地址,你会得到:
在这里插入图片描述

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值