SpringCloud学习笔记(一、SpringCloud 基础)
目录:
- 概述
- 观察者模式
- 代理模式
概述:
spring系列中使用了大量的设计模式,而最常见的便是这观察者、代理模式,所以在讲解SpringCloud之前我们先学习下这两个最常见的设计模式。
观察者模式:
java实现了自己的观察者模式 >>> java.util.Observable;
1、public synchronized void addObserver(Observer o);添加一个观察者
2、public synchronized void deleteObserver(Observer o);删除一个观察者
3、protected synchronized void setChanged();修改通知标记,使得观察者观察的对象发生变化时能记得得知
4、public void notifyObservers(Object arg) ;通知观察者,被观察这已发生变化
- public class ObserverDemo extends Observable {
- /**
- * 通知观察者被观察者已发生变化
- */
- public void notifyObserver() {
- // 设置变化状态为true >>> 被观察者已发生变化
- this.setChanged();
- // 将这一变化通知观察者
- this.notifyObservers();
- }
- public static void main(String[] args) {
- testAddObserver();
- testDeleteObserver();
- }
- private static void testAddObserver() {
- ObserverDemo observerDemo = new ObserverDemo();
- observerDemo.addObserver((o, arg) -> System.err.println("服务列表发生变化1"));
- observerDemo.notifyObserver();
- }
- private static void testDeleteObserver() {
- ObserverDemo observerDemo = new ObserverDemo();
- Observer observer = (o, arg) -> System.err.println("服务列表发生变化2");
- observerDemo.addObserver(observer);
- observerDemo.notifyObserver();
- observerDemo.deleteObserver(observer);
- observerDemo.notifyObserver();
- }
- }
代理模式:
1、静态代理
代理就是将除了自己本身需要做的核心业务外的任务交给代理人来做,如明星将接广告等事情交给经纪人。
- public interface Agent {
- /**
- * 拍广告
- */
- void advertising();
- }
- public class Celebrity implements Agent {
- @Override
- public void advertising() {
- System.err.println("Celebrity拍广告");
- }
- }
- public class Celebrity2 implements Agent {
- @Override
- public void advertising() {
- System.err.println("Celebrity2拍广告");
- }
- }
- public class ProxyDemo implements Agent {
- private Agent agent;
- public ProxyDemo(Agent agent) {
- this.agent = agent;
- }
- @Override
- public void advertising() {
- before();
- agent.advertising();
- after();
- }
- private void after() {
- System.err.println("after");
- }
- private void before() {
- System.err.println("before");
- }
- }
- class ProxyClient {
- public static void main(String[] args) {
- Agent agent = new ProxyDemo(new Celebrity());
- agent.advertising();
- System.out.println("----------------------------");
- Agent agent2 = new ProxyDemo(new Celebrity2());
- agent2.advertising();
- }
- }
静态代理的缺点是如果代理对象新代理了一个行为,那么委托对象也需要将新的代理行为重实现一遍,这样非常繁琐且重复。
为什么说静态代理繁琐呢,我们来增加一个行为。
- public interface Agent {
- /**
- * 拍广告
- */
- void advertising();
- /**
- * 集资
- */
- void collectMoney();
- }
然后我们修改一下Celebrity、Celebrity2
- public class Celebrity implements Agent {
- @Override
- public void advertising() {
- System.err.println("Celebrity拍广告");
- }
- @Override
- public void collectMoney() {
- System.err.println("Celebrity集资");
- }
- }
- public class Celebrity2 implements Agent {
- @Override
- public void advertising() {
- System.err.println("Celebrity2拍广告");
- }
- @Override
- public void collectMoney() {
- System.err.println("Celebrity2集资");
- }
- }
然后我们看看修改后的ProxyDemo
- public class ProxyDemo implements Agent {
- private Agent agent;
- public ProxyDemo(Agent agent) {
- this.agent = agent;
- }
- @Override
- public void advertising() {
- before();
agent.advertising();- after();
- }
- @Override
- public void collectMoney() {
- before();
agent.collectMoney();- after();
}- private void after() {
- System.err.println("after");
- }
- private void before() {
- System.err.println("before");
- }
- }
- class ProxyClient {
- public static void main(String[] args) {
- Agent agent = new ProxyDemo(new Celebrity());
- agent.advertising();
- agent.collectMoney();
- System.out.println("----------------------------");
- Agent agent2 = new ProxyDemo(new Celebrity2());
- agent2.advertising();
- agent2.collectMoney();
- }
- }
我们发现仅仅增加一个行为委托类也要实现collectMoney,实现时不仅需要调用agent.collectMoney,还需要调用before和after是不是很麻烦,而接下来要讲的动态代理正是为了解决这一问题。
2、动态代理
动态代理的例子还是和静态代理一样,我们首先将委托类写好。
- public class DynamicProxyDemo implements InvocationHandler {
- private Object target;
- public DynamicProxyDemo(Object target) {
- this.target = target;
- }
- @Override
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- after();
- Object invoke = method.invoke(target, args);
- before();
- return invoke;
- }
- private void after() {
- System.err.println("after");
- }
- private void before() {
- System.err.println("before");
- }
- public Object getProxy() {
- return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
- }
- }
其中最重要的是InvocationHandler接口和getProxy方法。
此时我们再往Agent增加一个行为,Celebrity、Celebrity2省略
- public interface Agent {
- /**
- * 拍广告
- */
- void advertising();
- /**
- * 集资
- */
- void collectMoney();
- /**
- * 安排行程
- */
- void travelArrangements();
- }
然后我们发现,DynamicProxyDemo不需要再实现新的行为了,这都归功于InvocationHandler !!!∑(゚Д゚ノ)ノ
- class DynamicProxyClient {
- public static void main(String[] args) {
- DynamicProxyDemo dynamic = new DynamicProxyDemo(new Celebrity());
- Agent agent = (Agent) dynamic.getProxy();
- agent.advertising();
- agent.collectMoney();
- agent.travelArrangements();
- }
- }
SpringCloud学习笔记(一、SpringCloud 基础)的更多相关文章
- SpringCloud学习笔记:SpringCloud简介(1)
1. 微服务 微服务具有的特点: ◊ 按照业务划分服务 ◊ 每个微服务都有独立的基础组件,如:数据库.缓存等,且运行在独立的进程中: ◊ 微服务之间的通讯通过HTTP协议或者消息组件,具有容错能力: ...
- SpringCloud学习笔记(2):使用Ribbon负载均衡
简介 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具,在注册中心对Ribbon客户端进行注册后,Ribbon可以基于某种负载均衡算法,如轮询(默认 ...
- SpringCloud学习笔记(3):使用Feign实现声明式服务调用
简介 Feign是一个声明式的Web Service客户端,它简化了Web服务客户端的编写操作,相对于Ribbon+RestTemplate的方式,开发者只需通过简单的接口和注解来调用HTTP API ...
- SpringCloud学习笔记(4):Hystrix容错机制
简介 在微服务架构中,微服务之间的依赖关系错综复杂,难免的某些服务会出现故障,导致服务调用方出现远程调度的线程阻塞.在高负载的场景下,如果不做任何处理,可能会引起级联故障,导致服务调用方的资源耗尽甚至 ...
- SpringCloud学习笔记(5):Hystrix Dashboard可视化监控数据
简介 上篇文章中讲了使用Hystrix实现容错,除此之外,Hystrix还提供了近乎实时的监控.本文将介绍如何进行服务监控以及使用Hystrix Dashboard来让监控数据图形化. 项目介绍 sc ...
- SpringCloud学习笔记(6):使用Zuul构建服务网关
简介 Zuul是Netflix提供的一个开源的API网关服务器,SpringCloud对Zuul进行了整合和增强.服务网关Zuul聚合了所有微服务接口,并统一对外暴露,外部客户端只需与服务网关交互即可 ...
- SpringCloud学习笔记(7):使用Spring Cloud Config配置中心
简介 Spring Cloud Config为分布式系统中的外部化配置提供了服务器端和客户端支持,服务器端统一管理所有配置文件,客户端在启动时从服务端获取配置信息.服务器端有多种配置方式,如将配置文件 ...
- SpringCloud学习笔记:服务支撑组件
SpringCloud学习笔记:服务支撑组件 服务支撑组件 在微服务的演进过程中,为了最大化利用微服务的优势,保障系统的高可用性,需要通过一些服务支撑组件来协助服务间有效的协作.各个服务支撑组件的原理 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- Java学习笔记:语言基础
Java学习笔记:语言基础 2014-1-31 最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...
随机推荐
- ubuntu 安装精简桌面; VNC; vncserver 配置
安装最简单的环境: apt-get install gnome-shell apt-get install gnome-panel apt-get install gnome-menus ...
- (入门SpringBoot)SpringBoot加接口操作日志好方法(九)
用Spring的切面去做,慕课网上的大神的小妙招,被我拷贝下来了.import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotati ...
- 苏州市java岗位的薪资状况(2)
上一篇已经统计出了起薪最高的top 10: 接着玩,把top 10 中所有职位的详细信息爬取下来.某一职位的详情是这样: 我们需要把工作经验.学历.职能.关键字爬取下来. from urllib.re ...
- 201871010113-刘兴瑞《面向对象程序设计(java)》第十三周学习总结
项目 内容 这个作业属于哪个课程 <任课教师博客主页链接>https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址>http ...
- css top,right,bottom,left设置为0有什么用?它和width:100%和height:100%有什么区别?
壹 ❀ 引 当我们使用position属性时,总免不了与top,left,right,bottom四个属性打交道,那么这四个属性都设置为0时有什么用,与宽高设置100%又有什么区别?本文对此展开讨论 ...
- Vs Code 2019软件安装教程及常用的入门设置
小编认为VsCode是一款非常好用的编辑器,插件丰富,支持的语言种类非常多.我所使用VsCode主要打一些前端的代码,自己感觉very good. 点击运行. 按图所示操作. 安装教程很简单的,主要是 ...
- IT兄弟连 Java语法教程 流程控制语句 循环结构语句4
do-while循环 Java还有一种循环是do-while.与for.while这些在循环顶部判断条件表达式的语句不同,do-while是在循环底部进行条件表达式的检查.这意味着do-while循环 ...
- 【Linux命令】系统状态检测命令8个(ifconfig、uname、uptime、free、who、last、history、sosreport)
目录 ifconfig获取网卡配置信息 uname查看系统内核版本 uptime查看系统的负载信息 free查看内存信息 who查看当前主机用户的终端信息 last查看系统的登录记录 history查 ...
- appium应用切换以及toast弹出框处理
一.应用切换 应用切换的方法很简单,直接调用driver.start_activity()方法,传入app_package和app_activity参数,示例代码如下: from appium imp ...
- Web前端基础(4):CSS(一)
1. CSS介绍 现在的互联网前端分三层: HTML:超文本标记语言.从语义的角度描述页面结构. CSS:层叠样式表.从审美的角度负责页面样式. JS:JavaScript .从交互的角度描述页面行为 ...