文章目录
1.1 微服务基础理论
1.1.1 背景
2008年以后,国内互联网行业飞速发展,我们对软件系统的需求已经不再是过去”能用就行”这种很low的档次了,像抢红包、双十一这样的活动不断逼迫我们去突破软件系统的性能上限,传统的IT企业”能用就行”的开发思想已经不能满足互联网高并发、大流量的性能要求。系统架构走向分布式已经是服务器开发领域解决该问题唯一的出路,然而分布式系统由于天生的复杂度,并不像开发单体应用一样把框架一堆就能搞定,因此各大互联网公司都在投入技术力量研发自己的基础设施。这里面比较有名的如阿里的开源项目dubbo, Netflix开发的一系列服务框架。
1.1.2 系统架构的演变
1.1.2.1 单体架构
单体架构也称之为单体系统或者是单体应用。就是一种把系统中所有的功能、模块耦合在一个应用中的架构方式。
存在的问题:
代码耦合:模块的边界模糊、依赖关系不清晰,整个项目非常复杂,每次修改代码都心惊胆战
迭代困难:每次功能的变更或bug的修复都会导致重新部署整个应用,随着代码的增多,构建、测试和部署的时间也会增加
扩展受限:单体应用只能作为一个整体进行扩展,无法根据业务模块的需要进行伸缩
技术债务:随着时间推移、需求变更和人员更迭,会逐渐形成应用程序的技术债务,并且越积越多不坏不修
阻碍创新:单体应用往往使用统一的技术平台或方案解决所有的问题,要想引入新技术平台会非常困难
1.1.2.2 分布式架构
分布式:需要按照功能点把系统拆分,拆分成独立的功能,单独为某一个节点添加服务器,需要系统之间配合才能完成整个业务逻辑。
分布式架构优点:
不同的团队负责不同的子项目
可以灵活的进行分布式部署
可以为某一模块单独加集群
分布式架构缺点:
模块之间有一些通用的业务逻辑无法共用。
1.1.2.3 soa架构
SOA:Service Oriented Architecture(面向服务的架构)。也就是把工程拆分成服务层,表现层两个工程。服务层中包含业务逻辑,只需要对外提供服务即可。表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现,使用ESB(Enterparise Servce Bus企业服务总线,代表技术:Mule、WSO2)提供表现层和服务层之间的交互。
存在的问题:
不支持集群、臃肿
1.1.2.4 微服务架构
微服务就是一个轻量级的服务治理方案。
代表技术:Eureka、zookeeper 等等
1.2 dubbox框架
1.2.1 dubbox简介
Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个基于Java的高性能RPC(Remote Procedure Call)框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。后期阿里巴巴停止了该项目的维护,于是当当网在这之上推出了自己的Dubbox。
1.2.2 dubboX架构
节点角色说明:
Provider: 暴露服务的服务提供方。
Container: 服务运行容器。
Registry: 服务注册与发现的注册中心。
Consumer: 调用远程服务的服务消费方。
Monitor: 统计服务的调用次调和调用时间的监控中心。
调用关系说明:
- 服务容器负责启动,加载,运行服务提供者。
- 服务提供者在启动时,向注册中心注册自己提供的服务。
- 服务消费者在启动时,向注册中心订阅自己所需的服务。
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
1.3注册中心 zookeeper
1.3.1 zookeeper介绍
Zookeeper是Apacahe Hadoop的子项目,可以为分布式应用程序协调服务,适合作为Dubbo服务的注册中心,负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互。
1.3.2 zookeeper的安装(Linux)
1、安装jdk
2、上传并解压缩zookeeper压缩包
tar -zxvf zookeeper-3.4.11.tar.gz -C /usr/java
3、将conf文件夹下zoo_sample.cfg复制一份,改名为zoo.cfg
cd /usr/java/zookeeper-3.4.11/conf
cp zoo_sample.cfg zoo.cfg
4、修改配置dataDir属性,指定一个真实目录
cd /usr/java/zookeeper-3.4.11
mkdir data
打开 zoo.cfg , 修改 data 属性:dataDir=/usr/java/zookeeper-3.4.11/data
1.3.3 启动zookeeper
进入 bin 目录,启动服务输入命令
./zkServer.sh star
输出以下内容表示启动成功
JMX enabled by default
Using config: /root/zookeeper-3.4.6/bin/../conf/zoo.cfg Starting zookeeper ... STARTED
关闭服务输入命令
./zkServer.sh stop
查看服务状态
./zkServer.sh status
如果是启动状态则是以下提示
JMX enabled by default Using config: /root/zookeeper-3.4.6/bin/../conf/zoo.cfg Mode: standalone
Window下 直接下载安装包 进入bin运行zKServer.cmd
就可以
1.4 dubbox入门案例
1.4.1 创建父工程
在父工程的pom.xml中添加依赖
<properties>
<spring.version>5.0.5.RELEASE</spring.version>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- dubbo依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.11.0.GA</version>
</dependency>
</dependencies>
1.4.2 定义公共接口
1.4.2.1 创建公共接口模块
1.4.2.2 创建公共接口
public interface UserService {
public String getName();
}
1.4.3定义服务提供方
1.4.3.1 创建服务提供方模块
点击Next
点击next
1.4.3.2.创建pom.xml
<dependencies>
<dependency>
<groupId>com.qf</groupId>
<artifactId>dubbox_interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8081</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
1.4.3.3 创建service
import com.alibaba.dubbo.config.annotation.Service;
//import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
@Override
public String getName() {
return "hello,Dubbox.......";
}
}
1.4.2.4 创建配置文件
创建applicationContext-service.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--<context:component-scan base-package="com.qf.service"></context:component-scan>-->
<!-- 用于配置当前应用名,不管该应用是提供者还是消费者 -->
<dubbo:application name="dubbo-service"/>
<!--注册中心地址,与zookeeper端口保持一致 -->
<dubbo:registry address="zookeeper://192.168.204.130:2181"/>
<!-- 用dubbo协议在20880端口暴露服务
name:传输协议,Dubbo支持的协议有Dubbo、RMI、http、WebService
port:端口,其他应用可以通过这个端口调用服务
-->
<dubbo:protocol name="dubbo" port="28080"/>
<!--发布服务
interface:暴露了UserService接口
ref:引用了 Spring 中名为 userServiceImpl 的类
-->
<!--<dubbo:service interface="com.qf.service.UserService" ref="userServiceImpl"></dubbo:service>-->
<!--批量扫描,发布服务-->
<dubbo:annotation package="com.qf.service"/>
</beans>
1.4.3.5 配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!-- 加载spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
1.4.4 定义服务消费方
1.4.4.1 创建服务消费方模块
1.4.4.2.创建pom.xml
<dependencies>
<dependency>
<groupId>com.qf</groupId>
<artifactId>dubbox_interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
1.4.4.3 定义controller
@Controller
@RequestMapping("/user")
public class UserController {
@Reference
//@Autowired
private UserService userService;
@RequestMapping("/getName")
@ResponseBody
public String getName() {
return userService.getName();
}
}
注意:Controller中注入HelloService使用的是Dubbo提供的@Reference注解
1.4.3.4 配置springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--<context:component-scan base-package="com.qf.controller" />-->
<mvc:annotation-driven />
<dubbo:application name="dubbo-consumer"/>
<dubbo:registry address="zookeeper://192.168.204.130:2181"/>
<!--引用服务
interface:和服务提供者的暴露的服务类型保持一致
id:消费方可以直接通过该id注入接口实例到controller
-->
<!--<dubbo:reference interface="com.qf.service.UserService" id="userService" />-->
<!--spring支持@Reference-->
<dubbo:annotation package="com.qf.controller"></dubbo:annotation>
</beans>
1.4.3.5 定义web.xml
<?xml version="1.0" encoding="UTF-8"?> CharacterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding utf-8 ```cpp forceEncoding true CharacterEncodingFilter /* springmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:springmvc.xml springmvc *.do ```1.4.4 启动测试
- 注意:先install父工程(大war包要去父工程找依赖的版本号)
- 先启动服务提供方再启动服务消费方
- 访问: http://localhost:8080/user/getName.do