SpringCloud微服务入门——多模块项目构建管理(附源码)

一、构建多模块的Maven项目

由于SpringCloud中有许多组件,每个组件都需要单独进行开发和维护,为了便于统一的版本维护和管理,我们经常会用到Maven的多模块模式。

1.创建主工程

在这里插入图片描述
在这里插入图片描述

2.点击这里下载插件

在这里插入图片描述

3.修改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">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.springcloud</groupId>
  <artifactId>demo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  <name>demo</name>

  <!--父级:Spring Boot-->
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.3.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>
  </properties>

  <!--Spring Cloud 版本序列配置-->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Finchley.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <!--Spring Boot 执行器组件-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <!--Spring Cloud 基础-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter</artifactId>
    </dependency>
    <!--Spring Cloud 服务注册组件-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <!--此处的依赖是SpringBoot2.0以后专用的,如果您使用的SpringBoot版本低于2.0请使用spring-cloud-starter-eureka-server-->
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    <!--Spring Boot Web组件-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--Spring Boot 测试组件-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.junit.platform</groupId>
      <artifactId>junit-platform-launcher</artifactId>
      <version>1.0.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-engine</artifactId>
      <version>5.0.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.junit.vintage</groupId>
      <artifactId>junit-vintage-engine</artifactId>
      <version>4.12.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

4.删除src目录

在这里插入图片描述

二、创建子模块eureka

1.右键创建新模块

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.在外层pom.xml加入子模块配置

<modules>
    <module>eureka</module>
</modules>

和parent同级
在这里插入图片描述

3.完善注册中心eureka

修改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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>eureka</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka</name>
    <packaging>jar</packaging>
    <description>Demo project for Spring Boot</description>

    <!--父工程的依赖-->
    <parent>
        <groupId>com.springcloud</groupId>
        <artifactId>demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <dependencies>

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.RELEASE</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>
    </build>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>

</project>

添加启动代码中添加@EnableEurekaServer注解

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;



@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(EurekaApplication.class, args);
    }

}

如果你发现@EnableEurekaServer无法引入,请检查你的SpringCloud版本与SpringBoot版本是否兼容

配置文件

默认生成的配置文件是application.properties,也可以写成application.yml格式,配置如下:

server:
  port: 8761
eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${
    
    eureka.instance.hostname}:${
    
    server.port}/eureka/

此时我们运行起来,访问http://localhost:8761

在这里插入图片描述
到这里注册中心就搭建成功了

三、创建订单系统和会员系统并注册到eureka

1.同理再建两个模块(我这里叫order和member)

在这里插入图片描述

2.同样在外层pom.xml加入子模块配置

<modules>
    <module>eureka</module>
    <module>order</module>
    <module>member</module>
</modules>

3.两个操作是一样的,下面以order为例

修改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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>eureka</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>order</name>
    <packaging>jar</packaging>
    <description>Demo project for Spring Boot</description>

    <!--父工程的依赖-->
    <parent>
        <groupId>com.springcloud</groupId>
        <artifactId>demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <dependencies>

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.RELEASE</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>
    </build>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>

</project>

修改application.yml

eureka:
  client:
    serviceUrl:
#eureka的注册中心地址
      defaultZone: http://localhost:8761/eureka
server:
#此项目端口号
  port: 8769
spring:
  application:
#注册进eureka的名字
    name: order-server

写入时建议去掉注释
启动类加上@EnableEurekaClient

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@EnableEurekaClient
@SpringBootApplication
public class OrderApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(OrderApplication.class, args);
    }
}

创建Controller目录,新增utilController.class
在这里插入图片描述

@RestController
public class utilcontroller {
    
    
    @RequestMapping("orderTest")
    public String orderTest(){
    
    
        return "this is order";
    }
}

运行,再次打开注册中心网页http://localhost:8761,就发现已经注册进去
在这里插入图片描述
接着访问http://localhost:8769/orderTest
在这里插入图片描述
member模块也是一样的写法
到这里就有人就要问了,阿七那模块怎么多我每次启动很麻烦怎么办?
这里科普一下,idea中有个窗口叫做 Run DashBoard 在这里可以管理多个模块的启停,这个面板一般情况下是关闭的

四、打开 Run DashBoard

在我们主工程springcloud下的.idea中找到workspace.xml,并找到RunDashboard
在这里插入图片描述
这里我们进去直接Ctrl+f 搜索RunDashboard
在这里插入图片描述
加入

<option name="configurationTypes">
    <set>
      	<option value="SpringBootApplicationConfigurationType" />
    </set>
</option>

在这里插入图片描述
保存后可以看到下面多出一个RunDashboard,这时我们就可以同时管理多个模块了
在这里插入图片描述

五、PRC两种远程调用的方法

1.Rest

通过rest的方式来调用,首先我们要导入rest的pom依赖,我们要使用用户调用订单,就在用户里添加调用依赖。先解释一下什么是ribbon-----ribbon是一个负载均衡客户端,类似nginx反向代理,可以很好的控制http和tcp的一些行为。
这里我们用order模块演示
修改启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@EnableEurekaClient
@SpringBootApplication
public class OrderApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(OrderApplication.class, args);
    }
    @Bean
    @LoadBalanced        // 开启负载均衡
    public RestTemplate restTemplate(){
    
    
        return new RestTemplate();
    }

}

修改utilController.class

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class utilController {
    
    
    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/orderTest1")
    public String orderTest1(){
    
    
        String str = restTemplate.getForObject("http://order-server/orderTest",String.class);
        return str;
    }

    @RequestMapping("orderTest")
    public String orderTest(){
    
    
        return "this is ordor";
    }
}

访问http://localhost:8769/orderTest1
在这里插入图片描述

2.Feign

Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解。Feign支持可插拔的编码器和解码器。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果。

这里使用member演示
加入配置pom.xml文件
写在dependencies里面

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

修改启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@EnableEurekaClient
@EnableFeignClients
@SpringBootApplication
public class MemberApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(MemberApplication.class, args);
    }

}

添加MemberService接口文件
在这里插入图片描述
MemberService

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;

@Service
@FeignClient("member-server")
public interface MemberService {
    
    
    @RequestMapping("/memberTest")
    public String memberTest();
}

utilController

import com.springcloud.member.Service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class utilController {
    
    
    @Autowired
    private MemberService memberService;
    @RequestMapping("memberTest")
    public String orderTest(){
    
    
        return "this is member";
    }


    @RequestMapping("/memTest")
    public String memTest(){
    
    
        String str = memberService.memberTest();
        return str;
    }
}

访问http://localhost:8770/memTest
在这里插入图片描述
当然这里也可以调用order模块的内容
把MemberService改成

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;

@Service
@FeignClient("order-server")
public interface MemberService {
    
    
    @RequestMapping("/orderTest")
    public String orderTest();
}

就可以了,这两个方式使用ribbon均衡负载,rest是手动启动,fegin是自动启动。

六、路由网关

路由网关有什么作用呢?上面订单和会员系统已经注册进服务中心,两者之间是通过网址直接访问。但是如果在浏览器里由订单访问会员,会因为域名不同而导致跨域问题。跨域问题的解决方案可以使用http client设置、设置请求头、nginx转发解决,那么在SpringCloud里面当然提供了一套解决方案,那就是网关ZUUL。
和刚刚一样,我们新建一个zuul模块测试
修改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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>zuul</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>zuul</name>
    <packaging>jar</packaging>
    <description>Demo project for Spring Boot</description>

    <!--父工程的依赖-->
    <parent>
        <groupId>com.springcloud</groupId>
        <artifactId>demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.RELEASE</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>
    </build>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>

</project>

修改application.yml


eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8080
spring:
  application:
    name: zuul-server
zuul:
  routes:
    api-a:
      path: /member/**
      service-id: member-server
    api-b:
      path: /order/**
      service-id: order-server

在启动类加入注释@EnableZuulProxy

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@EnableZuulProxy
@SpringBootApplication
public class ZuulApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(ZuulApplication.class, args);
    }

}

运行,访问http://localhost:8080/member/memTest和http://localhost:8080/order/orderTest
在这里插入图片描述
在这里插入图片描述

七、测试代码地址

GitHub地址:https://github.com/zsptsf/springcloud
码云地址:https://gitee.com/zspt_sf/springcloud
CSDN资源地址:https://download.csdn.net/download/qq_42783654/13455330

猜你喜欢

转载自blog.csdn.net/qq_42783654/article/details/110680072