理论
微服务概念
微服务的概念源于2014年3月Martin Fowler所写的一篇文章“Microservices”,微服务架构是一种架构模式,他提倡将单一应用程序划分成一组小的服务,服务之间互相互相协调、互相配合,为用户提供最终价值,每个服务运行在其独立的进程中,服务与服务间采用器轻量级的通信机制互相沟通(通常是基于HTTP的RESTFUL API)。每个服务都围绕着具体业务进行构建,并且能够被独立的部署到生产环境、类生产环境等,另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建。微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的(可以相互调用)。每个微服务仅关注于完成一件任务并很好的完成该任务,在所有的情况下,每个任务代表着一个小的业务能力。
耦合:两个东西的关联度,根据关联度的高低来分耦合的程度,
分为:完全耦合:关联紧密,不能分开,下一步以上一步为基础
松耦合:关联度不高
完全解耦:没有任何关联
微服务可以放在容器里跑,容器需要给微服务提供环境,容器里跑的就是微服务,容器跟微服务没有关系
为什么叫微服务架构?
整个架构里只要有微服务层,就可以叫做微服务架构
容易混淆的概念
Spring boot:spring boot是一个框架,一种全新的编程规范,他的产生简化了框架的使用,所谓简化是指简化了spring众多框架中所需的大量且繁琐的配置文件,所以springboot是一个服务于框架的框架,服务范围是简化配置文件
Spring cloud:spring cloud基于spring boot提供了一整套服务的解决方案,包括服务注册与发现,配置中心,全链路监控,服务网关,负载均衡,熔断器等组件
Spring cloud利用spring boot的开发便利性巧妙的简化了分布式系统的基础设施开发,spring cloud为开发人员提供了快速构建分布式系统的一些工具,包扣配置管理、服务发现、断路器、路由、微代理、事件总线,他们都可以用spring boot的开发风格做到一键启动和部署
Springboot与springcloud的区别
Spring boot:专注于快速方便的开发单个个体微服务(关注微观,简化配置);
Spring cloud:关注全局的微服务协调治理框架,将spring boot开发的一个个单体微服务组合并管理起来(关注宏观);
Spring boot可以离开spring cloud独立使用,但是spring cloud不可以离开spring boot,属于依赖关系。
Spring cloud全部组件的解析:
硬编码:代码写死,调用谁就写谁才能查找出来
第一台:192.168.2.10
第二台:192.168.2.20
两台:
[root@localhost ~]# yum -y install git
[root@localhost ~]# git clone https://github.com/luojunyong/spring-cloud-examples.git
注册中心的集群
第一台:
[root@localhost ~]# cd /root/spring-cloud-examples/eureka-producer-consumer/spring-cloud-eureka/
[root@localhost spring-cloud-eureka]# ls
pom.xml src
[root@localhost spring-cloud-eureka]# vim src/main/resources/application.properties
spring.application.name=spring-cloud-eureka #名称
server.port=8000 #端口
eureka.client.register-with-eureka=true #当前的应用是否注册到注册中心上
eureka.client.fetch-registry=true #当前的应用是否在注册中心上获取数据
eureka.client.serviceUrl.defaultZone=http://192.168.2.10:8000/eureka/,http://192.168.2.20:8000/eureka/ #两台注册中心的地址
[root@localhost spring-cloud-eureka]# source /etc/profile
[root@localhost spring-cloud-eureka]# mvn clean package 打包
[root@localhost spring-cloud-eureka]# java -jar target/spring-cloud-eureka-0.0.1-SNAPSHOT.jar
运行 会阻塞终端
第二台主机
[root@localhost ~]# cd /root/spring-cloud-examples/eureka-producer-consumer/spring-cloud-eureka/
[root@localhost spring-cloud-eureka]# vim src/main/resources/application.properties
server.port=8000 #端口
eureka.client.register-with-eureka=true #当前的应用是否注册到注册中心上
eureka.client.fetch-registry=true #当前的应用是否在注册中心上获取数据
eureka.client.serviceUrl.defaultZone=http://192.168.2.10:8000/eureka/,http://192.168.2.20:8000/eureka/ #两台注册中心的地址
[root@localhost spring-cloud-eureka]# source /etc/profile
打包并运行
[root@localhost spring-cloud-eureka]# mvn spring-boot:run 会阻塞终端
访问:
192.168.2.10:8000/
启动produce 两台
第一台
另开终端
[root@www ~]# cd /root/spring-cloud-examples/eureka-producer-consumer/spring-cloud-producer/
[root@www spring-cloud-producer]# vim src/main/resources/application.properties
spring.application.name=spring-cloud-producer
server.port=9000
eureka.client.serviceUrl.defaultZone=http://192.168.2.10:8000/eureka/,http://192.168.2.20:8000/eureka/
[root@www spring-cloud-producer]# source /etc/profile
[root@www spring-cloud-producer]# mvn spring-boot:run
第二台:
另开终端
[root@localhost ~]# cd /root/spring-cloud-examples/eureka-producer-consumer/spring-cloud-producer/
[root@localhost spring-cloud-producer]# vim src/main/resources/application.properties
eureka.client.serviceUrl.defaultZone=http://192.168.2.10:8000/eureka/,http://192.168.2.20:8000/eureka/
为了看到负载均衡组件的作用 所以需要把第二台主机源代码的内容进行更改 和第一台不一样
[root@localhost spring-cloud-producer]# vim src/main/java/com/neo/controller/HelloController.java
12 return "hello "+name+",thissdjgakjgaaaa";
[root@localhost spring-cloud-producer]# source /etc/profile
[root@localhost spring-cloud-producer]# mvn spring-boot:run
刷新注册中心的界面
验证注册中心和负载均衡组件
[root@www spring-cloud-consumer]# curl 192.168.2.10:9001/hello/aa
hello aa,thissdjgakjgaaaa
[root@www spring-cloud-consumer]# curl 192.168.2.10:9001/hello/aa
hello aa,this is first messge
需要与运行带熔断器的consumer
[root@www ~]# cd /root/spring-cloud-examples/spring-cloud-hystrix/spring-cloud-consumer-hystrix/
[root@www spring-cloud-consumer-hystrix]# vim src/main/resources/application.properties
spring.application.name=spring-cloud-consumer-hystrix
server.port=9001
feign.hystrix.enabled=true
eureka.client.serviceUrl.defaultZone=http://192.168.2.10:8000/eureka/,http://192.168.2.20:8000/eureka/
[root@www spring-cloud-consumer-hystrix]# mvn spring-boot:run
另开终端 访问 得到轮询的效果
[root@www ~]# curl 192.168.2.10:9001/hello/aa
hello aa,thissdjgakjgaaaa
[root@www ~]# curl 192.168.2.10:9001/hello/aa
hello aa,this is first messge
测试熔断器 可以在这里把第一台的produce停止掉 发现轮询效果没有了
[root@www ~]# curl 192.168.2.10:9001/hello/aa
hello aa,thissdjgakjgaaaa
[root@www ~]# curl 192.168.2.10:9001/hello/aa
hello aa,thissdjgakjgaaaa
熔断器的监控界面
第一台的produce启动
第一台上面的带熔断器的consumer结束掉
第一台上运行带熔断带监控的conumer开启
[root@www ~]# cd /root/spring-cloud-examples/hystrix-dashboard-turbine/spring-cloud-consumer-hystrix-dashboard/
[root@www spring-cloud-consumer-hystrix-dashboard]# vim src/main/resources/application.properties
spring.application.name=spring-cloud-consumer-hystrix-dashboard
server.port=9001
feign.hystrix.enabled=true
eureka.client.serviceUrl.defaultZone=http://192.168.2.10:8000/eureka/,http://192.168.2.20:8000/eureka/
[root@www spring-cloud-consumer-hystrix-dashboard]# source /etc/profile
[root@www spring-cloud-consumer-hystrix-dashboard]# mvn spring-boot:run
另开终端
[root@www ~]# curl 192.168.2.10:9001/hello/aa
hello aa,thissdjgakjgaaaa
[root@www ~]# curl 192.168.2.10:9001/hello/aa
hello aa,this is first messge
[root@www ~]# firefox 192.168.2.10:9001/hystrix
[root@localhost ~]# cd /root/spring-cloud-examples/spring-cloud-sleuth-zipkin/
注册中心
[root@localhost spring-cloud-sleuth-zipkin]# cd spring-cloud-eureka/
[root@localhost spring-cloud-eureka]# vim src/main/resources/application.yml
defaultZone: http://192.168.2.10:8761/eureka/
[root@localhost spring-cloud-eureka]# source /etc/profile
[root@localhost spring-cloud-eureka]# mvn spring-boot:run
链路追踪
另开终端
[root@www ~]# cd /root/spring-cloud-examples/spring-cloud-sleuth-zipkin/zipkin-server/
[root@www zipkin-server]# vim src/main/resources/application.yml
defaultZone: http://192.168.2.10:8761/eureka/
[root@www zipkin-server]# source /etc/profile
[root@www zipkin-server]# mvn spring-boot:run
运行生产者
另开终端
[root@www ~]# cd /root/spring-cloud-examples/spring-cloud-sleuth-zipkin/spring-cloud-producer/
[root@www spring-cloud-producer]# vim src/main/resources/application.yml
7 base-url: http://192.168.2.10:9000
14 defaultZone: http://192.168.2.10:8761/eureka/
[root@www spring-cloud-producer]# source /etc/profile
[root@www spring-cloud-producer]# mvn spring-boot:run
运行网关
另开终端
[root@www ~]# cd /root/spring-cloud-examples/spring-cloud-sleuth-zipkin/spring-cloud-zuul/
[root@www spring-cloud-zuul]# vim src/main/resources/application.yml
base-url: http://192.168.2.10:9000
defaultZone: http://192.168.2.10:8761/eureka/
[root@www spring-cloud-zuul]# source /etc/profile
[root@www spring-cloud-zuul]# mvn spring-boot:run
另开终端 访问
[root@www ~]# curl 'http://192.168.2.10:8888/producer/hello?name=haha&token=123'
hello haha,this is first messge
[root@www ~]# curl 'http://192.168.2.10:8888/producer/hello?name=haha&token=123'
hello haha,this is first messge
[root@www ~]# firefox 192.168.2.10:9000