【SpringCloud】springcloud 学习环境搭建

一、springcloud 学习环境简介

在进行具体的环境搭建之前,我们要知道 springcloud 和 springboot 是有版本要求的,反正我是踩了好长时间的坑。如果你觉得你的环境没有问题,但是就是跑不起来,那么你要看一看你的 springcloud 和 springboot 的版本是否匹配。

如果你在启动时遇到如下的报错,那么说明你的 springcloud 和 springboot 的版本不匹配。

java.lang.ClassNotFoundException: org.springframework.boot.context.properties.Xxxxxxx

我使用的是 Hoxton.SR3 的 springcloud 和 2.2.5.RELEASE 的 springboot。

下面是 spring 官网给出的版本选择:
在这里插入图片描述

下面我们将会一次搭建 实体类服务、服务提供者、服务消费者、注册中心。他们的关系大概如下图所示:
在这里插入图片描述

正常情况搭建环境的时候,应该是放在多台服务上的,但是条件有限,我都放在一个maven项目中,通过一个maven项目进行统一管理(主要是方便,因为 Intellij IDEA 中一个窗口只能打开一个项目)。结构如下:
在这里插入图片描述

二、总的maven容器的搭建

第一步:搭建一个空的 maven 项目

略…

第二步:设置打包方式(pom.xml)

<!--    打包方式:pom-->
<packaging>pom</packaging>

第三步:管理相关依赖

<!--    设置全局属性-->
<properties>
    <!--版本控制:举个例子-->
    <junnit.version>4.12</junnit.version>
</properties>

<dependencyManagement>
    <dependencies>
<!--            springcloud依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR3</version>
<!--                <version>Greenwich.SR1</version>-->
            <type>pom</type>
            <scope>import</scope>
        </dependency>
<!--            springboo依赖-->
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.1.4.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
<!--             连接数据库:注意 如果你使用的mysql版本是8.0+,那么这里要使用8.0.26版依赖
                            因为,我们需要com.mysql.cj.jdbc.Driver-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.26</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.6</version>
        </dependency>
<!--           mybatis-springboot启动器-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>
        <!--        Druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.6</version>
        </dependency>
<!--            junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junnit.version}</version>
        </dependency>
<!--            lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>
<!--            log4j-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
<!--            logback-core-->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.2.3</version>
        </dependency>

    </dependencies>
</dependencyManagement>

第四步:静态资源导出配置(在进行打包时保证 java 下的静态资源可以成功导出到 target 中)

<!--在java目录下的资源时导不出的,所以我们需要手动配xml文件-->
<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>



三、搭建实体类服务 springcloud-api

第一步:创建一个空的maven子项目

略…

第二步:导入 lombok 依赖

当然你也可以不使用 lombok,而是手动创建 实体类 的构造方法、get 方法、set 方法和 toString方法。

<dependencies>
<!--        从父pom中获取lombok-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

第三步:编写实体类

略…



四、服务提供者的搭建 springcloud-provider-dept-8081

所谓的服务提供者其实就是我们在 springboot 阶段的 service 和 controller 还有 mapper。通常我们都会将将该服务对应的端口号写在最后。

第一步:在总的 maven 中创建一个 springboot 项目

略…

第二步:导入相关的依赖

因为存在 mapper 所以需要与数据库打交道,需要与数据库相关的依赖。

值得注意的是其中有一个 "导入实体类服务"的操作,因为数据库操作需要用到实体类,所以我们需要导入上面我们搭建的 “实体类服务”。

<dependencies>
    <!--        jdbc 启动器-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <!--        web 启动器-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--        mybatis-spring整合 启动器 -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.0</version>
    </dependency>

    <!--        导入实体类服务:此服务中需要用到pojo,配置 springcloud-api 模本-->
    <dependency>
        <groupId>com.tiger</groupId>
        <artifactId>springcloud-api</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <!--        驱动器 连接器-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <!--        druid 数据源-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.6</version>
    </dependency>
    <!--        logback-core-->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
    </dependency>
    <!--        junit 单元测试-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

第三步:编写配置文件(application.yaml)

server:
  port: 8081

spring:
  application:
    name: springcloud-provider-dept-8081
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db01?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
    username: root
    password: root123123
    type: com.alibaba.druid.pool.DruidDataSource


mybatis:
  type-aliases-package: com.tiger.pojo
  mapper-locations: classpath:mybatis/mapper/*.xml
  configuration:
    cache-enabled: true

第四步:创建编写 mapper 、service、controller

略…



五、服务消费者的搭建 springcloud-consumer-dept-8080

第一步:在总的 maven 中创建一个 springboot 项目

略…

第二步:导入相关的依赖

消费者服务不需要和数据库直接打交道,消费者服务直接面对的是 service 、所以不需要与数据库和实体类相关的依赖导入。

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>


        <!--        此服务中需要用到pojo,配置 springcloud-api 模本-->
        <dependency>
            <groupId>com.tiger</groupId>
            <artifactId>springcloud-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--        junit 单元测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

第三步:配置服务器端口(application.yaml)

server:
  port: 8081

第四步:创建编写 controller

大家是不是会很好奇,即使吧 controller 编写完成,但是也是调不到 service 的,因为服务消费者服务中就没有 service。

其实消费者服务要调的 service 是 服务提供者的 service,更加准确的是简介调用 服务提供者的 service,具体看图解:
在这里插入图片描述

如果我们想要调用 controller ,那么我们需要有 url,我们很是容易就可以得到提供者服务的controller中的url(因为url是我自己规定的)。

在浏览器中执行 url 十分的简单,但是在消费者服务的 controller 中想要执行 url 貌似是我们第一次接触。

我们知道之所以 springcloud 可以实现微服务,一部分原因是因为 springcloud 使用的是基于 Rest 风格的通信。那么在 spring 中 有没有对 Rest 进行封装使得我们可以在服务之间进行通信。答案是肯定的。


在spring 有 RestTemplate 模版类,其中又如下几种方法
在这里插入图片描述
getForObject:使用 get 方法执行 url 。String/URL 指的是需要实行的 url;Class 表示响应值的类型;Object/Map<> 表示 url 带有的参数,当然你也可以将参数拼接到url中。
在这里插入图片描述

postForObject:使用 post 方法执行 url。
在这里插入图片描述

这样我们就可以实现在消费者服务的 controller 中想要执行 url 。我们在使用 RestTemplate 之前需要将 RestTemplate 注入到 bean 中,所以我们可以编写一个 BeanConfig 类实现 RestTemplate 的注入

package com.tiger.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class BeanConfig {

    @Bean
    public RestTemplate restTemplateBean(){
        return new RestTemplate();
    }
}

接下来我们就可以在消费者服务中编写 controller:
http://localhost:8081//dept/select/ 是提供者服务中的controller请求(提供者服务中 controller 的代码 ‘‘略’’ 了)

    private static final String URL_HEAD = "http://localhost:8081/";

    @Autowired
    private RestTemplate restTemplatel;

    @RequestMapping("/list/{id}")
    public Department queryOne(@PathVariable("id") int dNum){

        return restTemplatel.getForObject(URL_HEAD+"/dept/select/"+dNum,Department.class);
    }
    @RequestMapping("/lists")
    public List<Department> queryAll(){

        return restTemplatel.getForObject(URL_HEAD+"/dept/select/",List.class);
    }

测试:
启动 springcloud-provider-dept-8081springcloud-consumer-dept-8080 ,然后访问 http://localhost:8080/list/5
在这里插入图片描述

六、Eureka 注册中心的搭建 springcloud-eureka-7001

第一步:在总的 maven 中创建一个 springboot 项目

略…

第二步:导入相关的依赖

这里大家要注意一点:Eureka 的依赖有 spring-cloud-starter-eureka-server 和 spring-cloud-starter-netflix-eureka-server 两种,我们使用 spring-cloud-starter-netflix-eureka-server,原因如下:
在这里插入图片描述

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

第三步:配置配置文件(application.yaml)

server:
  port: 7001

# Eureka 配置
eureka:
  instance:
    hostname: localhost  # Eureka 服务端的实例名
  client:
    register-with-eureka: false # 是否注册自己
    fetch-registry: false # false 表示自己为注册中心
    service-url:  # 别人向注册中心申请时所用的地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

第四步:开启Eureka服务可用

在主启动类上添加上 @EnableEurekaServer

@SpringBootApplication
@EnableEurekaServer //Eureka 的服务端,允许别人注册进来
public class SpringcloudEureka7001Application {

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

}

测试:

启动 springcloud-eureka-7001 ,访问 http://localhost:7001
在这里插入图片描述
至此,我们的环境搭建就完成了,下一节我们将着重介绍一下服务注册、信息配置与自我保护机制。


只要朝着一个方向努力,一切都会变得得心应手…
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值