① 每个服务都比较简单,只关注于一个业务功能。
② 微服务架构方式是松耦合的,可以提供更高的灵活性。
③ 微服务可通过最佳及最合适的不同的编程语言与工具进行开发,能够做到有的放矢地解决针对性问题。
④ 每个微服务可由不同团队独立开发,互不影响,加快推出市场的速度。
⑤ 微服务架构是持续交付(CD)的巨大推动力,允许在频繁发布不同服务的同时保持系统其他部分的可用性和稳定性。
2.缺点
微服务的一些想法在实践上是好的,但当整体实现时也会呈现出其复杂性。
3.常用技术选型
SpringBoot:SpringBoot是构建微服务的基础框架,是SpringCloud的基础,其自带Tomcat,不需要在Tomcat中,可以直接启动。自身也有各项优点,如自动化配置、快速开发、轻松部署等,非常适合用作微服务架构中各项具体微服务的开发框架。它不仅可以帮助用户快速地构建微服务,还可以轻松简单地整合SpringCloud实现系统服务化。而如果使用了传统的Spring构建方式的话,在整合过程中用户还需要做更多的依赖管理工作,才能让它们完好地运行起来。
3.2 持久层框架
MyBatis:MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。通常会用于SpringBoot微服务框架。
(1)RabbitMQ
RabbitMQ是基于AMQP协议的开源实现,由以高性能、可伸缩性出名的Erlang写成。目前客户端支持 Java、.Net/C#和Erlang。在AMQP(Advanced Message Queuing Protocol)的组件中,Broker中可以包含多个Exchange(交换机)组件。Exchange可以绑定多个Queue以及其他Exchange。消息会按照Exchange中设置的Routing规则,发送到相应的MessageQueue。在Consumer消费了这个消息之后,会跟Broker建立连接,发送消费消息的通知。此时Message Queue才会将这个消息移除。
(2)Elasticsearch
它是一个基于Apache Lucene实现的开源的实时分布式搜索和分析引擎。SpringBoot的项目也提供了集成方式:spring-boot-starter-data-elasticsearch以及spring-data-elasticsearch。
(3)Kafka
它是一个高性能的基于发布/订阅的跨语言分布式消息系统。Kafka的开发语言为 Scala。其比较重要的特性是:
l 高吞吐量、低延迟:Kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition,consumer group对partition进行consume操作。其高吞吐的特性,除了可以作为微服务之间的消息队列,也可以用于日志收集、离线分析、实时分析等;
l 可扩展性:Kafka集群支持热扩展;
l 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失;
l 容错性:允许集群中节点失败(即若副本数量为n,则允许n-1个节点失败);
l 高并发性:支持数千个客户端同时读写。
(4)ZooKeeper
它是一个分布式、开放源码的分布式应用程序协调服务,是Google(谷歌)Chubby的一个开源的实现,是Hadoop和HBase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括配置维护、域名服务、分布式同步、组服务等。ZooKeeper的架构通过冗余服务实现高可用性。
(1)了解应用系统需要的基础服务。
(2)安装应用系统需要的基础服务。
准备:配置本地yum ,上传gpmall-repo包(在项目3-软件包/商城系统-单节点中),安装基础环境。
#hostname mall
#bash
vi /etc/ hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.49.168 mall (自己的IP地址)
将提供的packages包上传到服务器的/root目录下,并配置本地local.repo文件,具体代码如下所示。
#mkdir /opt/centos
#mount /dev/cdrom
#mv /etc/yum.repo.d/* /media
#vi /etc/yum.repo.d/local.repo
[centos]
name=centos
baseurl=file:///opt/centos
gpgcheck=0
enabled=1
[mall]
name=mall
(1)安装Java环境
#yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
查看Java 版本信息
#java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
(2)安装Redis服务
#yum install redis -y
(3)安装Elasticsearch 服务
#yum install elasticearch
(4)安装 nginx 服务
#yum install nginx -y
(5)安装MariaDB 数据库
#yum install mariadb mariadb-server -y
(6)安装ZooKeeper服务
将提供的zookeeper-3.4.14.tar.gz上传至云主机的/opt内,解压压缩包命令如下:
#tar -zxvf zookeeper-3.4.14.tar.gz
进入到zookeeper-3.4.14/conf目录下,将zoo_sample.cfg文件重命名为zoo.cfg,命令如下:
#cd zookeeper-3.4.14.tar.gz/conf
#mv zoo_sample.cfg zoo.cfg
#cd zookeeper-3.4.14/bin
#./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
查看Zookeeper状态,命令如下:
#./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: standalone
(7)安装Kafka服务
将提供的kafka_2.11-1.1.1.tgz包上传到云主机的/opt目录下,解压该压缩包,命令如下:
#tar -zxvf kafka_2.11-1.1.1.tgz
#cd /kafka_2.11-1.1.1/bin
#./kafka-server-start.sh -daemon ../config/server.properties
使用jps或者netstat –ntpl命令查看Kafka是否成功启动,命令如下:
#jps
6039 Kafka
1722 QuorumPeerMain
6126 Jps
#yum install -y net-tools
#netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1008/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 887/master
tcp6 0 0 :::9092 :::* LISTEN 6039/java
tcp6 0 0 :::46949 :::* LISTEN 6039/java
tcp6 0 0 :::2181 :::* LISTEN 1722/java
tcp6 0 0 :::48677 :::* LISTEN 1722/java
tcp6 0 0 :::22 :::* LISTEN 1008/sshd
tcp6 0 0 ::1:25 :::* LISTEN 887/master
运行结果查看到Kafka服务和9092端口,说明Kafka服务已启动。
(1)启动数据库并配置
修改数据库配置文件并启动MariaDB数据库,设置root用户密码为123456,并创建gpmall数据库,将提供的gpmall.sql导入。
修改/etc/my.cnf文件,添加字段如下所示:
#
# This group is read both both by the client and the server
# use it for options that affect everything
#
[client-server]
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
启动数据库命令如下。
#systemctl start mariadb
设置root用户的密码为123456并登录。
#systemctl start mariadb
# mysqladmin -uroot password 123456
登录数据库
#mysql -uroot –p123456
设置root用户的权限,命令如下:
MariaDB [(none)]> grant all privileges on *.* to root@localhost identified by '123456' with grant option;
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> grant all privileges on *.* to root@"%" identified by '123456' with grant option;
Query OK, 0 rows affected (0.001 sec)
将gpmall.sql文件上传至云主机的/root目录下。创建数据库gpmall并导入gpmall.sql文件。
MariaDB [(none)]> create database gpmall;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> use gpmall;
MariaDB [mall]> source /root/gpmall.sql
退出数据库并设置开机自启。
MariaDB [mall]> Ctrl-C -- exit!
Aborted
#systemctl enable mariadb
(2)启动Redis服务
修改Redis配置文件,编辑/etc/redis.conf文件。
将bind 127.0.0.1这一行注释掉;将protected-mode yes 改为 protected-mode no。
启动Redis服务命令如下。
# systemctl start redis
#systemctl enable redis
Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service.
(3)配置Elasticsearch服务并启动
配置Elasticsearch服务命令如下:
# vi /etc/elasticsearch/elasticsearch.yml
在文件最上面加入3条语句如下:
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-credentials: true
将如下4条语句前的注释符去掉,并修改network.host的IP为本机IP。
cluster.name: my-application
node.name: node-1
network.host: 192.168.49.170(本机ip)
http.port: 9200
最后修改完之后保存退出。然后启动Elasticsearch并设置开机自启,命令如下。
# systemctl start elasticsearch
# systemctl enable elasticsearch
Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.
(4)启动Nginx服务
启动Nginx服务命令如下。
# systemctl start nginx
# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
(1)了解应用系统的部署架构。
(2)单节点部署应用系统。
基础准备
使用提供gpmall-shopping-0.0.1-SNAPSHOT.jar、gpmall-user-0.0.1-SNAPSHOT.jar、shopping-provider-0.0.1-SNAPSHOT.jar、user-provider-0.0.1-SNAPSHOT.jar 、dist这5个包部署应用系统,其中4个jar包为后端服务包,dist为前端包。(在项目3-软件包\商城系统-单节点\gpmall项目包-单机下)
3.1全局变量配置
修改/etc/hosts文件,修改项目全局配置文件如下:
#vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.49.170mall
192.168.49.170kafka.mall
192.168.49.170 mysql.mall
192.168.49.170 redis.mall
192.168.49.170 zookeeper.mall
3.2部署前端
将dist目录上传至服务器的/root目录下。接着将dist目录下的文件,复制到Nginx默认项目路径(首先清空默认项目路径下的文件)。
#rm -rf /usr/share/nginx/html/*
# cp -rvf dist/* /usr/share/nginx/html/
修改Nginx配置文件/etc/nginx/conf.d/default.conf,添加映射如下所示
# vi /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /user {
proxy_pass http://127.0.0.1:8082;
}
location /shopping {
proxy_pass http://127.0.0.1:8081;
}
location /cashier {
proxy_pass http://127.0.0.1:8083;
}
#error_page 404 /404.html;
#cd /usr/share/nginx/html/
#cd dist/* /usr/share/nginx/html/
#cd dist/
#ls
#cd
#rm -rf /usr/share/nginx/html/dist
#rm -rf /usr/share/nginx/html/*
# cd dist/
#ls
#cp -rvf dist/* /usr/share/nginx/html/
#cd /usr/share/nginx/html/
重启Nginx服务,命令如下:
# systemctl restart nginx
前端部署完毕!
3. 部署后端
将提供的4个jar包上传到服务器的/root目录下,并启动,启动命令如下:
# nohup java -jar shopping-provider-0.0.1-SNAPSHOT.jar &
[1] 6432
[root@mall gpmall]# nohup: ignoring input and appending output to ‘nohup.out’
# nohup java -jar user-provider-0.0.1-SNAPSHOT.jar &
[2] 6475
[root@mall gpmall]# nohup: ignoring input and appending output to ‘nohup.out’
# nohup java -jar gpmall-shopping-0.0.1-SNAPSHOT.jar &
[3] 6523
[root@mall gpmall]# nohup: ignoring input and appending output to ‘nohup.out’
[root@mall gpmall]# nohup java -jar gpmall-user-0.0.1-SNAPSHOT.jar &
[4] 6563
[root@mall gpmall]# nohup: ignoring input and appending output to ‘nohup.out’
后端部署完毕!
4. 网站访问
打开浏览器,在地址栏中输入http://192.168.49.170(本机IP),访问界面,如图所示。