文档章节

01【微服务爱情故事之李雷和韩梅梅】SpringBoot基础

十七宝宝
 十七宝宝
发布于 2017/09/25 13:05
字数 1528
阅读 68
收藏 0

   在微服务架构盛行的今天,我们不得不先聊一聊这是个什么鬼。我们来做一个比喻,一个应用好比一个公司,在垂直应用中,就好比我们要做一件事情,所有员工都按照CEO的指挥来做事情。随着公司的发展,事情越来越多,做的也越来越乱,很快遇到瓶颈。那么,微服务架构就代表了,我们把公司拆分成一个个独立的部门,各负其责,公司才能够得以扩大发展。当然,拆分成一个个部门也会引发一系列分布式问题,比如,一个部门和另外一个部门要协同做一件事情,这两个部门做事是有先后顺序的,先做的部门做完了,却没有通知到合作的部门,又或是合作的部门没有做成这件事却没有通知到该部门,此时该部门告诉CEO这个事情已经搞定了(所谓分布式事务的问题)。

  目前,市场上主流的基于JVM的分布式架构主要有国内阿里开源的DUBBO和Spring FrameWork的SpringCloud的两种解决方案。十七宝宝目前所在的公司主要基于DUBBO开发,不谈DUBBO,我们的故事从SpringCloud开始。

在上世纪90年代,有两个初中生,李雷和韩梅梅,李雷很喜欢韩梅梅,但是迟迟没有表白。(十七宝宝真没有教人早恋的意思)

1.创建李雷(使用Maven创建):

项目结构如图所示

①pom.xml与application.yml文件配置如下:

<?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>spring.cloud.love.lilei</groupId>
   <artifactId>demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>demo</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.7.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>

   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      <java.version>1.8</java.version>
      <spring-cloud.version>Dalston.SR3</spring-cloud.version>
   </properties>

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

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

   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</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>


</project>

其中eureka的配置是下期预告,本篇博客暂时先挖一个坑

application.yml的配置非常简单:

server:
  port: 8000

②创建LileiApplication用于李雷出生

package spring.cloud.love.lilei;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class LileiApplication {

   /**
    * 创建restTemplate用于依赖入注
    * 相当于给李雷买了一部手机,随时可以拿来给韩梅梅打电话发微信
    * @return
    */
   @Bean
   public RestTemplate restTemplate() {
      return new RestTemplate();
   }

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

要注意此启动类要在项目路径的上层路径

③创建CallHanController用于表白韩梅梅

package spring.cloud.love.lilei.controller;

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

@RestController
public class CallHanController {

    //拿到手机
    @Autowired
    private RestTemplate restTemplate;


    @GetMapping("/showLove/{message}")
    public String findById(@PathVariable String message) {
        //给韩梅梅发微信表白得到回应
        return this.restTemplate.getForObject("http://localhost:8001/respond/" + message, String.class);
    }


}

2.创建韩梅梅(同样使用Maven创建):

项目结构基本类似

①pom.xml与application.yml文件配置如下:

<?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>spring.cloud.love.hanmeimei</groupId>
   <artifactId>demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>demo</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.7.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>

   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      <java.version>1.8</java.version>
      <spring-cloud.version>Dalston.SR3</spring-cloud.version>
   </properties>

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

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

   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</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>


</project>

eureka的配置同样是下期预告,本篇博客暂时先挖一个坑

application.yml:

server:
  port: 8001

 

②创建HanmeimeiApplication 用于韩梅梅出生

package spring.cloud.love.hanmeimei;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HanmeimeiApplication {

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

 

③创建HanRespondController 用于回应李雷:

package spring.cloud.love.hanmeimei.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HanRespondController {

    @GetMapping("/respond/{message}")
    public String respond(@PathVariable String message) {
        System.out.println("***李雷发微信说:"+message);
        if(message.equals("I love u")){
            return "I miss u";
        }else {
            return "我要睡觉了,回聊";
        }
    }



}

 

通过

HanmeimeiApplication
LileiApplication

启动两个项目,使李雷和韩梅梅出生。

注意:Spring Boot会自动扫描@SpringBootApplication所在类的同级包,以及下级包里的所有bean,所以一定要注意启动类和扫描类的包路径,防止踩坑。当然,会有一些特殊配置等改变此扫描逻辑,这是我们后面要讨论的话题,在此不做赘述!

在浏览器访问李雷应用:

给韩梅梅发微信,明天要去图书馆么

得到回应:我要睡觉了,回聊

说明可以访问韩梅梅的回应服务

给韩梅梅发微信,I love u

得到回应:I miss u

     

       虽然这是十七宝宝在代码里设置如此,但是,这也代表了一个真理,爱,一定要直接一点,勇敢一点。这或许也是十七宝宝至今依旧还是一条单身狗的原因吧。李雷和韩梅梅终于一起愉快的在校园的夕阳下奔跑,而看此博客的你也对基于SpringBoot的应用开发有了一个大概的认识。

     本系列博客,大概会持续更新很久很久,希望大家多多关注。

PS:一些知识点与问题解答

1.SpringBoot启动类的扫描路径

Spring Boot会自动扫描@SpringBootApplication所在类的同级包,以及下级包里的所有bean,一定要注意这点哦,因为这点十七宝宝踩了坑啊。

2.那么多的注解怎么记忆

很多是混合注解啦,比如这个

@RestController
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    String value() default "";
}

就是SpringMVC的两个注解的组合啦

多点进去看一下是最佳实践有没有

3.十七宝宝你有没有女朋友

没有,没有,真的没有!为什么问伦家这个问题!好羞涩啊!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

© 著作权归作者所有

十七宝宝
粉丝 0
博文 12
码字总数 6864
作品 0
杭州
程序员
私信 提问
spring、springMvc、springBoot和springCloud的联系与区别

版权声明:本文为博主原创文章,如需转载,请标明出处。 https://blog.csdn.net/alan_liuyue/article/details/80656687 spring和springMvc: 1. spring是一个一站式的轻量级的java开发框架,...

尘光掠影
2018/06/11
0
0
Java B2B2C多用户商城 springboot架构-spring、springMvc、springBoot和springCloud的联系与区别

spring、springMvc、springBoot和springCloud的联系与区别 需要JAVA Spring Cloud大型企业分布式微服务云构建的B2B2C电子商务平台源码请加企鹅求求 :二一四七七七五六三三 spring和springM...

it菲菲
2018/12/18
0
0
学习 Spring Boot 知识看这一篇就够了

从2016年因为工作原因开始研究 Spring Boot ,先后写了很多关于 Spring Boot 的文章,发表在技术社区、我的博客和我的公号内。粗略的统计了一下总共的文章加起来大概有六十多篇了,其中一部分...

ityouknow
2018/05/28
0
0
OSC 第 118 期高手问答 -- SpringBoot 快速构建微服务体系

OSCHINA 本期高手问答(6月8日- 6月15日) 我们请来了 @afoo (王福强) 为大家解答关于 SpringBoot 快速构建微服务体系方面的问题。 @afoo (王福强) ,资深Java技术专家和架构师,具有多年一线开...

开源中国股侠
2016/06/07
9.2K
79
微服务资源springboot、springcloud、docker、dubbo项目实战等倾心分享

精彩内容 java实战练习项目教程 全网最全电子图书分享 你所需要的大数据视频教程 java学习视频教程及源码 今天又是周末,还是想给大家送一些福利,因为最近一直有小伙伴问我要springboot等微...

公众号_好好学java
2018/08/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

IT兄弟连 Java语法教程 编写Java源代码

现在我们来一步一步的编写第一个Java程序,鼎鼎大名的“HelloWorld”。 编写Java源代码 编写Java源代码可以使用任何无格式的文本编辑器,在Windows操作系统上可以使用记事本、Edit Plus等程序...

老码农的一亩三分地
11分钟前
2
0
JavaScript箭头函数中的this详解

前言 箭头函数极大地简化了this的取值规则。 普通函数与箭头函数 普通函数指的是用function定义的函数: var hello = function () {console.log("Hello, Fundebug!");} 箭头函数指的是用...

开元中国2015
22分钟前
2
0
ETL测试工具简介

ETL测试 ETL测试过程与其他测试过程类似,包括一些阶段。 确定业务需求 测试计划 设计测试用例和测试数据 测试执行和错误报告 总结报告 测试结束 ETL测试的类型 生产验证测试: 也称为表平衡...

python测试开发人工智能安全
34分钟前
1
0
OSChina 周四乱弹 —— 不能空腹吃早餐

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @for_ :#今日歌曲推荐# 很好听的钢琴曲,节奏简单,有一点伤感。分享Fabrizio Paterlini的单曲《Veloma》: 《Veloma》- Fabrizio Paterlini ...

小小编辑
今天
1K
13
探讨android更新UI的几种方法

作为IT新手,总以为只要有时间,有精力,什么东西都能做出来。这种念头我也有过,但很快就熄灭了,因为现实是残酷的,就算一开始的时间和精力非常充足,也会随着项目的推进而逐步消磨殆尽。我...

天王盖地虎626
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部