`

SpringCloud(一): SpringBoot 创建简单的微服务

阅读更多

 

 (编写不易,转载请注明:http://shihlei.iteye.com/blog/2398709)

 

 一 概述 :

 

    基于sring boot 创建 简单的微服务。

 

    spring boot 版本:1.5.7.RELEASE。

 

二 项目组成

 

        父项目:x.demo.springcloud

 

        module:

                1)spring-cloud-microservice:微服务项目,实现获取当前时间服务
                2)spring-cloud-webfront:前端项目,根据业务调用各种微服务,这里只是获取时间。

 

三 Idea 创建 Spring boot工程向导使用

 

(一)创建父工程:

 

1) file- > new - > project :

 


 

2) 设置 group , artifact 等:我创建父工程,所以Type 选择 Maven Pom

 

 

 3)依赖选择:暂时不需要依赖啥,统一依赖spring-boot :1.5.8

 


 

4)下一步,项目创建完成了,生成的pom 集成了spring-boot的父pom,注意,这里的packaging 我手动改成了pom类型

 

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

   <name>spring-cloud-demo</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.8.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>
   </properties>

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

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

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

 

 

(二)创建子工程: 

 

1)file -> new -> module

 


 

2) 指定group ,artifact:


 

 3) 指定下module的存放位置


 

 4)默认生成spring boot , maven约定的项目结构:其中pom我改为集成我的父pom

 

 

<parent>
        <groupId>x.demo.springcloud</groupId>
        <artifactId>spring-cloud</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../../pom.xml</relativePath>
 </parent>
 

 

(三)项目结构

 

注:方框圈起来的暂时没用,都删掉了

  

四 微服务demo 开发

pom:

 

<?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>

    <artifactId>spring-cloud-microservice</artifactId>
    <packaging>jar</packaging>

    <name>spring-cloud-microservice</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>x.demo.springcloud</groupId>
        <artifactId>spring-cloud</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../../pom.xml</relativePath>
    </parent>

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

        <!-- utils -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

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

 

(一)spring-cloud-microservice:时间微服务实现

 

 
1)指定微服务端口号:默认生成的配置文件:/src/main/resources/application.properties , 我这里改成application.yml文件,spring 支持 xml ,properties, yml等格式,yaml 更结构化
 
server:
  port: 10001
 
2)默认生成的启动类:会扫描该类所在的包及子包,并启动tomcat 到上面的端口,拉起服务
 
package x.demo.springcloud.microservice;

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


@SpringBootApplication
public class SpringCloudServiceApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringCloudServiceApplication.class, args);
	}
}
 
3)创建服务controller: 和普通的controller 完全一样
 
package x.demo.springcloud.microservice.controller;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * rest服务
 */
@RestController
@RequestMapping("/time/v1")
public class RemoteTimeV1Controller {

    private static final DateTimeFormatter DEFALUT_FORMATER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    /**
     * 获取时间服务
     *
     * @param format 自定义格式
     * @return 时间
     */
    @GetMapping("/now")
    public ProtocolResult<String> now(@RequestParam(name = "format", required = false) String format) {
        String time;
        try {
            if (StringUtils.isEmpty(format)) {
                time = LocalDateTime.now().format(DEFALUT_FORMATER);
            } else {
                DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format);
                time = LocalDateTime.now().format(dateTimeFormatter);
            }
            return new ProtocolResult<>(0, "success", time);
        } catch (Exception e) {
            return new ProtocolResult<>(-1, e.getMessage());
        }
    }
}
 
协议类:
 
package x.demo.springcloud.microservice.controller;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ProtocolResult<T> {
    //0 成功,非0 失败
    private int code;

    //响应提示信息
    private String message;

    //响应实体
    private T body;

    public ProtocolResult(int code, String message) {
        this.code = code;
        this.message = message;
    }
}
 
4)测试:开发完成,springboot 还提供了 spring-boot-starter-test,集成了相关测试的包,方面方面测试微服务
 
package x.demo.springcloud.microservice.controller;

import static org.assertj.core.api.Assertions.assertThat;

import javax.annotation.Resource;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.test.context.junit4.SpringRunner;


@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@Slf4j
public class RemoteTimeV1ControllerIT {

    @Resource
    private TestRestTemplate restTemplate;


    @Test
    public void testNowNoFormat() throws Exception {
        ProtocolResult<String> result = restTemplate.getForObject("/time/v1/now", ProtocolResult.class);
        assertThat(result.getCode()).isEqualTo(0);
        log.info("result : " + result);
    }

    @Test
    public void testNowNoFormatYYYY() throws Exception {
        ProtocolResult<String> result = restTemplate.getForObject("/time/v1/now?format=yyyy", ProtocolResult.class);
        assertThat(result.getCode()).isEqualTo(0);
        log.info("result : " + result);
    }

}  
 
4)启动服务
 

  
5)界面测试
 

  

(二)spring-cloud-webfront:一般前端业务层组装各个我服务,进行使用,这里做个简单的调用时间服务的客户端

 

POM:

 

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

    <name>spring-cloud-webfront</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>x.demo.springcloud</groupId>
        <artifactId>spring-cloud</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../../pom.xml</relativePath>
    </parent>

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

        <!-- spring -->

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

        <!-- utils -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

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

  

 

1)指定web端口和微服务调用地址
 
server:
  port: 20001
# 自定义配置
timeMisroService:
  v1:
    uri: http://localhost:10001/time/v1
 
2)默认生成的启动类
 
package x.demo.springcloud.webfront;

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

@SpringBootApplication
public class SpringCloudWebfrontApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringCloudWebfrontApplication.class, args);
	}
}
 
 
3)controller
 
package x.demo.springcloud.webfront.web;

import javax.annotation.Resource;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import x.demo.springcloud.webfront.service.TimeService;

@RestController
@RequestMapping("/time")
public class TimeController {

    @Resource(name = "timeV1MicorServiceImpl")
    private TimeService timeService;

    @GetMapping("/now")
    public String now() {
        return timeService.now();
    }
} 
 
4)service
 
package x.demo.springcloud.webfront.service;

public interface TimeService {
    /**
     * 获取当前时间
     * @return 当前时间,格式:yyyy-MM-dd HH:mm:ss
     */
    String now();
}
package x.demo.springcloud.webfront.service.impl;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import x.demo.springcloud.webfront.service.TimeService;

@Service
public class TimeV1MicroServiceImpl implements TimeService {
    //时间格式
    private static final String time_format = "yyyy-MM-dd HH:mm:ss";

    @Value("${timeMisroService.v1.uri}")
    private String timeMicroServiceV1Uri;

    @Resource
    private RestTemplate restTemplate;

    /**
     * 获取当前时间
     *
     * @return 当前时间,格式:yyyy-MM-dd HH:mm:ss
     */
    @Override
    public String now() {
        ProtocolResult<String> result = restTemplate.getForObject(timeMicroServiceV1Uri + "/now", ProtocolResult.class);
        return result.getBody();
    }
}

package x.demo.springcloud.webfront.conf;

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

@Configuration
public class SpringConfiguration {

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

}
 
4)启动方法同上
 
5)  Web验证
 

 

五 总结

    spring boot 基于约定,免去了大部分的配置,比如spring mvc ,rest json序列化等

  • 大小: 89.2 KB
  • 大小: 32.1 KB
  • 大小: 100.1 KB
  • 大小: 68.4 KB
  • 大小: 83.3 KB
  • 大小: 85.3 KB
  • 大小: 135.9 KB
  • 大小: 74.1 KB
  • 大小: 254.3 KB
  • 大小: 23.4 KB
分享到:
评论

相关推荐

    基于Jdk11 + SpringCloud + SpringBoot 开发的微服务中后台快速开发平台

    lamp-cloud 基于Jdk11 + SpringCloud + SpringBoot 开发的微服务中后台快速开发平台,专注于多租户(SaaS架构)解决方案,亦可作为普通项目(非SaaS架构)的基础开发框架使用,目前已实现插拔式数据库隔离、SCHEMA隔离...

    Spring cloud与Spring boot 集成完整案例

    Spring Cloud和Spring Boot是两个非常重要的Java开发框架,它们在微服务架构中扮演着核心角色。Spring Boot简化了创建独立的、生产级别的基于Spring的应用程序的过程,而Spring Cloud则为开发者提供了快速构建分布式...

    18年springboot+springclound 微服务 视频学习教程

    在实际项目中,SpringBoot用于快速构建单个服务,而SpringCloud则用于管理和协调这些服务,形成一个完整的微服务生态系统。通过视频学习教程,你可以逐步掌握如何创建、配置、测试和部署这些服务,从而构建出高效、...

    SpringBoot+SpringCloud面试题.doc

    Spring Boot作为Spring框架的一个子项目,旨在简化应用程序的创建和配置过程,而Spring Cloud则提供了全面的服务治理工具,使得在分布式系统中进行服务发现、负载均衡、配置管理和熔断等操作变得更加便捷。...

    基于spring boot的spring cloud 开源框架

    springCloud是基于SpringBoot的一整套实现微服务的框架。他提供了微服务开发所需的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等组件。最重要的是, 跟...

    SpringBoot+SpringCloud+nacos+gateway+mybatis搭建微服务

    整合这些技术,首先需要创建Spring Boot项目,然后引入Spring Cloud的相关依赖,包括Spring Cloud Netflix Eureka(服务发现)、Spring Cloud Config(配置中心)、Spring Cloud OpenFeign(服务调用)等。...

    基于 SpringCloud + SpringBoot + vue 构建的即时通讯系统源码.zip

    SpringCloud是基于SpringBoot实现的一系列微服务解决方案,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等)...

    Snowy-Cloud是小诺团队下基于SpringCloud Alibaba + SpringBoot.zip

    总之,Snowy-Cloud项目通过集成SpringCloud Alibaba与SpringBoot,构建了一个完善的微服务架构,实现了服务的注册与发现、流量控制、分布式事务、消息队列等功能,为企业级应用提供了高效、稳定和可扩展的运行环境。...

    分布式微服务例子:SpringBoot2.X+SpringCloud+SpringDataJPA+Consul+Feign+Swagger

    在这个例子中,我们看到一个基于Spring Boot 2.x、Spring Cloud、Spring Data JPA、Consul、Feign和Swagger构建的微服务系统。以下是这些技术在系统中的关键应用和知识点: 1. **Spring Boot 2.x**: 是一个快速开发...

    microservices:使用SpringBoot玩微服务的沙箱

    在IT行业中,微服务架构已经成为了现代应用程序开发的主流趋势,SpringBoot框架则是实现这一架构的强大工具。本文将深入探讨如何使用SpringBoot构建和管理微服务,并基于提供的"microservices:使用SpringBoot玩...

    SpringBoot+SpringCloud微服务搭建demo

    在本项目中,我们将探讨如何使用SpringBoot和SpringCloud构建一个微服务架构的演示系统。SpringBoot以其便捷的启动和管理特性,简化了Java应用程序的开发过程,而SpringCloud则为构建分布式系统提供了全面的工具集。...

    springboot和springcloud中文文档

    SpringBoot和SpringCloud是两个非常重要的Java开发框架,它们在微服务领域有着广泛的应用。SpringBoot简化了Spring应用的初始搭建以及开发过程,而SpringCloud则为构建分布式系统提供了工具集,包括服务发现、负载...

    springcloud视频学习

    2. SpringBoot与SpringCloud的结合:SpringBoot简化了Spring应用的初始搭建和配置过程,而SpringCloud则是基于SpringBoot实现的一套微服务解决方案,两者结合可以快速构建微服务应用。 3. 创建并部署第一个Spring...

    springboot,springcloud 项目视频

    例如,首先使用SpringBoot创建微服务,然后通过Eureka实现服务的注册与发现,接着利用Zuul作为API网关,统一处理请求,同时配合Hystrix实现服务容错保护。配置中心Spring Cloud Config则用于集中管理和动态更新各个...

    spring boot 、spring cloud 、docker 微服务实战

    在《Spring Cloud与Docker微服务架构实战》中,你将学习如何使用Spring Boot创建微服务,并通过Spring Cloud进行服务治理。同时,你会了解到如何利用Docker构建和部署这些微服务,包括编写Dockerfile、使用Docker ...

    spring cloud 2021.1 spring alibaba cloud 2021.1 springboot 2.6

    Spring Boot简化了Spring应用程序的创建,而Spring Cloud则提供了微服务开发的一整套解决方案。本文将深入探讨Spring Boot 2.6、Spring Cloud 2021.1以及Spring Alibaba Cloud 2021.1的相关知识点,同时也会关注...

    Snowy-Cloud是小诺团队下基于SpringCloud Alibaba + SpringBoot+AntDes.zip

    【标题】"Snowy-Cloud是小诺团队下基于SpringCloud Alibaba + SpringBoot+AntDes.zip" 提供的信息表明,这是一款由小诺团队开发的软件项目,它采用了微服务架构,具体技术栈包括SpringCloud Alibaba、SpringBoot以及...

    springboot+springcloud微服务架构,有脚本配置,可跑

    总结来说,这个压缩包提供了一个基于Spring Boot和Spring Cloud构建的微服务架构实例,包含了一些关键的微服务组件、文档和可能的脚本配置,对于学习和实践微服务架构是一个很好的资源。通过理解每个组件的作用和...

    anan基于JDK11、Spring Boot 2.5.x、Spring Cloud 生态体系技术,采用微服务前后端.zip

    标题中的“anan基于JDK11、Spring Boot 2.5.x、Spring Cloud 生态体系技术,采用微服务前后端”表明这是一个使用最新技术栈构建的微服务项目。在这个项目中,开发人员选择了Java 11(JDK11)作为编程语言,Spring ...

Global site tag (gtag.js) - Google Analytics