原创 | SpringBoot微服务和分布式

2020-02-11 18:04:32 浏览数 (1)

大家好,我是润森。期末化学已挂,谁来烧纸,挂得又有动力学习了?

微服务

微服务是一种面向服务的架构(SOA)风格(Java开发人员最重要的技能之一),其中,应用程序被构建为多个不同的小型服务的集合而不是单个应用程序。与单个程序不同的是,微服务让你可以同时运行多个独立的应用程序,而这些独立的应用程序可以使用不同的编码或编程语言来创建。庞大而又复杂的应用程序可以由多个可自行执行的简单而又独立的程序所组成。这些较小的程序组合在一起,可以提供庞大的单程序所具备的所有功能。(百度百科)

分布式

所谓分布式,无非就是将一个系统拆分成多个子系统并分布到多个服务器上.

简单的说,是指将用户界面、控制台服务、数据库管理三个层次部署在不同的位置上。其中用户界面是客户端实现的功能,控制台服务是一个专门的服务器,数据管理是在一个专门的数据库服务器上实现的。

分布式常用框架:Dubbo,MQ消息队列,Zookeeper等.

MQ消息队列

关于MQ消息队列(RabbitMQ、ZeroMQ、ActiveMQ等.)

在高并发分布式环境下,由于来不及同步处理,请求往往发生堵塞,比如说,大量的insert、update之类的请求 同时到达数据库,直接导致无所的行锁和表锁,甚至最后请求会堆积过多,从而触发too many connections错误。

通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。

ACK机制-当消费者拿到消息的瞬间,队列中的消息立即删除.同时删除 前台页面,缓存库,数据库 .(ACK机制保证了性能的高效.)

Dubbo

Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。

Dubbo好处

1、使用Dubbo可以将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,可用于提高业务复用 灵活扩展,使前端应用能更快速的响应多变的市场需求。

2、分布式架构可以承受更大规模的并发流量。

Zookeeper

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

Docker安装zookeeper

zookeeper:3.4 是稳定版本,但我使用最新的3.5.6

https://hub.docker.com/_/zookeeper/

拉取zookeeper

代码语言:javascript复制
docker pull zookeeper

创建docker-zookeeper容器

代码语言:javascript复制
docker run --name docker-zookeeper -p 2888:2888 -p 3888:3888 -p 8080:8080 -p 2181:2181 --restart always -d zookeeper:latest

注意,这种方式仅供本机开发,测试,学习使用,生产环境至少要部署3台做个集群

  • --name 给这个容器起个名字
  • -p 把主机的2181端口号绑定到容器的2181端口号上
  • --restart always 如果容器有异常会自动重启
  • -d 在后台运行

SpringBoot整合Dubbo

分布式就是由多个springboot项目搭建而成,每个springboot项目提供的服务不一样

IDEA创建空项目,创建consumer-user用户消费和provider-ticket提供卖票服务两个模块,创建只需要选择WEB依赖

注意:卖票服务和用户消费包名必须相同

具体目录如下:

环境配置

consumer-user用户消费和provider-ticket提供卖票两个springboot中都引入dubbozkclient相关依赖

代码语言:javascript复制
<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>0.1.0</version>
</dependency>
<!--引入zookeeper的客户端工具-->
      <!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
<dependency>
    <groupId>com.github.sgroschupf</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.1</version>
</dependency>

provider-ticket提供卖票服务application.properties相关依赖配置

代码语言:javascript复制
dubbo.application.name=provider-ticket
dubbo.scan.base-packages=com.example.ticket.service
dubbo.registry.address=zookeeper://106.54.232.112:2181

consumer-user用户消费application.properties相关依赖配置

代码语言:javascript复制
dubbo.application.name=consumer-user
dubbo.registry.address=zookeeper://106.54.232.112:2181

编写卖票服务接口TicketService

代码语言:javascript复制
public interface TicketService {
    // 定义买票方法
    public String getTicket();
}

编写继承服务接口TicketServiceImpl,引用的Service是dubbo的Service`import com.alibaba.dubbo.config.annotation.Service;``

代码语言:javascript复制
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;

/**
 * @author: 毛利
 */
@Component
@Service //将服务发布出去
public class TicketServiceImpl implements TicketService {
    @Override
    public String getTicket() {
        return "《厉害了,我的国》";
    }
}

ProviderTicketApplication启动类中添加@EnableDubbo

代码语言:javascript复制
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@EnableDubbo
@SpringBootApplication
public class ProviderTicketApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderTicketApplication.class, args);
    }
}

将编写卖票服务接口TicketService复制到用户消费模块

代码语言:javascript复制
package com.example.ticket.service;
/**
 * @author: 毛利
 */
public interface TicketService {
    public String getTicket();
}

UserService 用户服务

代码语言:javascript复制
import com.alibaba.dubbo.config.annotation.Reference;
import com.example.ticket.service.TicketService;
import org.springframework.stereotype.Service;

/**
 * @author: 毛利
 */
@Service
public class UserService {

    @Reference
    TicketService ticketService;
    public void hello() {
        String ticket = ticketService.getTicket();
        System.out.println("买到票了:"   ticket);
    }
}

具体目录

测试

在用户消费中测试是否能买到票

代码语言:javascript复制
@SpringBootTest
class ConsumerUserApplicationTests {

    @Autowired
    UserService userService;
    @Test
    void contextLoads() {
        userService.hello();
    }
}

具体目录如下:

运行

开始卖票服务的Springboot工程,运行用户服务测试类

总结

创建Dubbo分布项目步骤如下

  • 1、将服务提供者注册到注册中心
  • 2、引入dubbo和zkclient相关依赖
  • 3、配置dubbo的扫描包和注册中心地址
  • 4、使用@Service发布服务

再自我介绍一下吧。我叫润森,是一个的学习者,分享自己的所学所得。

0 人点赞