SpringCloud入门:02-SpringCloud实战-创建简单的微服务demo

SpringCloud-02-SpringCloud实战-创建简单的微服务demo

SpringCloud简介

SpringCloud:SpringCloud是基于SpringBoot的基础上构建的,用于快速构建分布式系统的通用模式的工具集

SpringCloud的特点:

  • 约定优于配置
  • 使用各种环境
  • 隐藏组件的复杂性
  • 开箱即用
  • 轻量级的组件
  • 组件丰富,功能齐全
  • 灵活

SpringCloud的版本:

不同于大多数的Spring项目都是以“主版本号.次版本号.增量版本号.里程牌版本号”的形式,SringCloud采用的是特殊的版本号:SpringCloud利用的是英文单词SRX(X为数字)来命名版本号。其中英文单词可以理解为主版本,而SR则是:"ServiceRelease"表示Bug修复,而数字表示第几次。

例如 Edgware SR4则是表明Edgware版本的第四次bug修复


SpringCloud 技术以及工具

SpringCloud的开发之前需要我们了解如下的技术:

  • java基础开发
  • SpringBoot的基础开发
  • Maven项目构建工具

服务提供者和服务消费者

在微服务中,我们可以用服务提供者和服务消费者来表示微服务之间的关系

服务提供者:提供服务的一方

服务消费者:调用服务的一方

下面我们利用IDEA来分布编写服务提供者和服务消费者

服务提供者:

1、新建一个Project
在这里插入图片描述
在这里插入图片描述
我们使用mybatis作为持久层框架,使用Mysql数据库
在这里插入图片描述
项目完成后如下:
在这里插入图片描述
2、编写pom文件,导入SpringCloud需要的依赖:
完整的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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.springbootdemo</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <project.bulid.sourceEncoding>UTF-8</project.bulid.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

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

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <!--<scope>runtime</scope>-->
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <!--添加spring cloud 依赖-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencides</artifactId>
                <version>Edgware.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>

</project>

3、创建数据库以及对于的表:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  `phone` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

INSERT INTO `user` VALUES ('1', 'limi', '123', '123');
INSERT INTO `user` VALUES ('2', 'io', '123', '123');

4、创建用户实体类

package com.springbootdemo.demo.model;

public class User {

    private Integer id;
    private String username;
    private String password;
    private String  phone;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

5、创建Dao层访问数据库

package com.springbootdemo.demo.mapper;

import com.springbootdemo.demo.model.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface UserMapper {

    @Select(value="select * from user where id=#{id}")
    public User select(Integer id);
}

6、创建service层和其实现层serviceImpl

UserService接口如下:

package com.springbootdemo.demo.service;

import com.springbootdemo.demo.model.User;

public interface UserService {

    User select (Integer id );
}

UserServiceImpl接口实现如下:

package com.springbootdemo.demo.service.Impl;

import com.springbootdemo.demo.mapper.UserMapper;
import com.springbootdemo.demo.model.User;
import com.springbootdemo.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public User select (Integer id){
        return userMapper.select(id);
    }
}

7、创建Controller如下:

package com.springbootdemo.demo.controller;

import com.springbootdemo.demo.model.User;
import com.springbootdemo.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;



    @RequestMapping("/select/{id}")
    public User select(@PathVariable Integer id){
        return userService.select(id);
    }

}

8、编写application.yml配置文件如下:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver

#配置数据源
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver

9、完整的项目结构如下显示:
在这里插入图片描述

10、在postman中访问http://127.0.0.1:8080/user/select/1,可以得到如下的结果:

在这里插入图片描述

服务消费者:

服务消费者主要使用的是RestTemplate来访问对应的微服务的api接口,从而查询到指定的微服务提供的数据

1、新建一个springcloude项目 主要的步骤和服务提供者的类似,并且其pom文件导入的依赖也和上面的相同。这里不再赘述:直接给出项目的完整的结构图:
注意:这里的pom不需要再和之前一样导入mybatis的依赖,否则会报数据库没有配置的错误,完整的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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.springCloudDemo</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <project.bulid.sourceEncoding>UTF-8</project.bulid.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--<dependency>-->
            <!--<groupId>org.mybatis.spring.boot</groupId>-->
            <!--<artifactId>mybatis-spring-boot-starter</artifactId>-->
            <!--<version>2.0.0</version>-->
        <!--</dependency>-->

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <!--添加spring cloud 依赖-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencides</artifactId>
                <version>Edgware.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>

</project>

2、创建Pojo类

package com.springclouddemo.demo.pojo;

public class User {

    private Integer id;
    private String username;
    private String password;
    private String phone;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

3、application.yml的配置文件如下:

server:
#  注意这里的端口和服务提供者的不能是同一个端口
  port: 8082

4、主启动类如下:

package com.springclouddemo.demo;

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 DemoApplication {

    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

5、Controller创建如下:

package com.springclouddemo.demo.controller;


import com.springclouddemo.demo.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

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

    @RequestMapping("/user/select/{id}")
    public User select(@PathVariable Integer id){
        return this.restTemplate.getForObject("http://localhost:8080/user/select/"+id,User.class);
    }

}

6、启动:注意要先启动服务提供者,才可以启动服务消费者

在这里插入图片描述

然后在postman中访问服务消费者的端口:http://127.0.0.1:8082/user/select/1
注意:8082是服务消费者的端口,而8080是服务提供者的端口,但是这里我们通过服务消费者来访问服务提供者的服务,就是最简单的微服务的调用。
在这里插入图片描述


思考

我们这个简单demo中服务消费者使用服务提供者的微服务是利用RestTemplate的模板,我们的地址也是用的直接的地址:http://localhost:8080/user/sleect/{#id}。
但是在实际的开发过程中,这种硬编码的方式基本是不可取的,仔细想想要是我们服务提供者的服务地址发生了改变,我们的服务调用者就要重新修改地址然后来调用服务,是不是觉得非常的繁杂和低效,SpringCloud当然知道这个问题,所以给我们一个服务发现组件-来进行服务的注册和发现,但是这些要在Eureka,Zookeeper,那里我们在做讲解。


今日分享:

如果打算爱一个人,你要想清楚,是否愿意为了他,放弃如上帝般自由的心灵,从此心甘情愿有了羁绊。
——菲茨杰拉德 《了不起的盖茨比》

### 回答1: 以下是一个使用 Swoole 实现的简单微服务 demo: 服务端代码: ```php <?php // 创建 Server 对象 $server = new Swoole\Http\Server("0.0.0.0", 9501); // 处理请求 $server->on('Request', function ($request, $response) { // 获取请求的 URL $url = $request->server['request_uri']; // 根据 URL 路由到对应的处理函数 switch ($url) { case '/hello': $response->end('Hello World!'); break; case '/time': $response->end('Current time: ' . date('Y-m-d H:i:s')); break; default: $response->end('Invalid URL'); break; } }); // 启动服务器 $server->start(); ``` 客户端代码: ```php <?php // 创建 HTTP 客户端对象 $client = new Swoole\Http\Client('127.0.0.1', 9501); // 发送请求 $client->get('/hello', function ($client) { echo $client->body; }); $client->get('/time', function ($client) { echo $client->body; }); // 关闭连接 $client->close(); ``` 这个 demo 实现了一个简单的 HTTP 微服务,当客户端请求 `/hello` 时,返回 `Hello World!`,请求 `/time` 时,返回当前时间。客户端通过 Swoole 提供的 HTTP 客户端发送请求,并等待响应返回。需要注意的是,在 Swoole 中,客户端和服务端都是异步非阻塞的,这意味着客户端发送请求后不会阻塞等待响应,而是立即执行后续代码,直到收到响应后再执行回调函数。 ### 回答2: Swoole是一款基于PHP语言的高性能网络通信引擎,同时也是一个强大的异步、并发服务器框架。微服务是一种架构风格,将一个大型的应用程序拆分成多个小而独立的服务,每个服务在自己的进程中运行,通过网络互相通信。在Swoole中实现一个微服务demo可以具体分为以下几个步骤: 1. 环境准备:首先确保已经安装好PHP以及Swoole扩展,并且启用了Swoole扩展。 2. 定义服务:根据需求,确定需要实现的服务,并编写相应的代码。可以针对不同的服务定义不同的类或函数。 3. 实现服务:在编写服务代码时,可以使用Swoole提供的异步IO特性来提高性能。比如,可以使用协程来处理请求,避免阻塞。 4. 通信与协议:考虑服务之间的通信方式和协议。Swoole提供了多种协议支持,例如TCP、UDP、HTTP等。可以根据实际需求选择合适的协议。 5. 部署与运行:将不同的服务部署在不同的进程中,并通过网络通信连接起来。可以使用Swoole提供的进程管理器或者自定义脚本来管理服务的启动、停止等操作。 6. 测试与调试:对已经实现的微服务demo进行测试和调试,确保服务之间的通信正常,功能达到预期。 总结来说,Swoole微服务demo的实现主要包括环境准备、定义服务、实现服务、通信与协议、部署与运行、测试与调试等步骤。通过Swoole的高性能和强大的异步IO特性,我们可以在PHP领域中实现高效、可扩展的微服务架构。 ### 回答3: Swoole微服务demo是一种基于Swoole扩展开发的微服务示例。Swoole是PHP的一款高性能网络通信框架,可以用于构建高并发、高性能的服务器和网络应用。而微服务是一种软件架构风格,将一个应用拆分为一系列小而独立的服务,每个服务都运行在自己的进程或容器中,通过网络通信进行协作。 Swoole微服务demo的目的是展示如何使用Swoole来构建一个简单微服务体系。这个示例可以包含多个微服务,每个微服务都具有独立的功能且可以独立部署和运行。 在这个demo中,我们可以使用Swoole来创建一个HTTP服务器,监听特定的端口,并处理来自客户端的HTTP请求。每个微服务可以使用Swoole的协程来处理请求,提高服务器的并发处理能力。 示例中的每个微服务可以实现不同的功能,例如用户管理、订单处理、数据分析等。每个微服务可以将其功能暴露为API接口供其他微服务或客户端调用。微服务之间可以通过HTTP或其他适当的通信协议进行通信,实现服务间的协作和数据交换。 为了更好地管理和监控微服务,我们还可以引入和集成其他开源工具和框架,如Consul、ETCD、Prometheus等,以实现微服务的服务发现、负载均衡、监控和日志分析等功能。 总之,Swoole微服务demo通过使用Swoole框架和微服务架构风格,可以帮助我们更好地理解和实践高性能网络应用和微服务架构的开发,提升系统的并发处理能力和可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值