Gateway路由配置从数据库或Redis获取
目前SpringCloud Gateway只支持配置文件yml、properties和配置文件@Configuration的方式配置路由。这种方式有弊端,就是如果需要变更路由信息,修改路由规则,然后重启Gateway,修改或增加的路由规则才会生效。如果出现该问题,在Gateway重启的这段时间里,所有接入Gateway服务的应用都不可用。这肯定是不可行的。
Gateway默认的配置yml配置文件
@Configuration
路由初始化不管是什么方式配置路由,这些配置最后都会被封装到RouteDefinition中
123456789101112131415public class RouteDefinition { private String id; @NotEmpty @Valid private List<PredicateDefinition> predicates = new ArrayList<>(); @Valid private List<FilterDefinition> filters = new ArrayLis ...
Spring Cloud之Feign 转发请求头(header参数)
在做接口请求时,我们经常会在header头中增加一些鉴权信息,如token 或 jwt,那么在通过fegin从A server去调用B server的接口时,如果B server的接口需要header信息,我们需要将A sever获取的header转发到B上。
解决方式我们需要实现Feign提供的一个接口RequestInterceptor
1234567891011121314151617181920@Configurationpublic class FeignConfiguration implements RequestInterceptor{ private final Logger logger = LoggerFactory.getLogger(getClass()); @Override public void apply(RequestTemplate template) { ServletRequestAttributes attributes = (Servle ...
Java8新特性——Optional
Java8 OptionalOptional是一个包装类。类中包装的对象可以为null也可以为非null,简单来讲就是把null封装了一层, 防止出现空指针异常
Optional优化null判断看一段代码:
123456public static String getAge(Student student){ if(null == student){ return "Unkown"; } return student.getAge();}
该方法获取学生年龄,为了防止Student对象为空,做了防御性检查,我们可以使用Optional优化该段代码
123public static String getAge(Student student){ return Optional.ofNullable(student).map(Student::getAge()).orElse("Unkown");}
可以看到,Optional结合Lambda表达式,可以让代码看起来更 ...
Java8新特性——Stream流
Stream流Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
什么是Stream流Stream 是对集合(Collection)对象功能的增强。
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。
举个简单的例子:
1234List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", &quo ...
Java8新特性——Lambda表达式
Lambda表达式Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。
什么是Lambda?对于Java变量,我们可以对其进行赋值,比如:
1int value = 233;
如果想把一块代码赋值给一个变量,在Java8之前,这个是做不到的,但是在Java8之后,我们可以使用Lambda表达式来实现,例如:
1aBlockCode = (s) -> System.out.println(s);
上面,把“赋值给一个变量的函数”就是Lambda表达式
但是这里仍然有一个问题,就是变量aBlockCode的类型应该是什么?
下面我们来介绍函数式接口
函数式接口在Java8中,所有的Lambda的类型都是一个接口,而Lambda表达式本身,就是那段函数,就是这个接口的实现,举个例子:
首先定义一个接口:
1234@FunctionalInterfaceinterface MyLambdaInterface{ ...
Java并发编程2
Java关于线程的相关知识,马士兵老师的高并发编程系列av11076511,知识点2
死锁死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
产生死锁的必要条件1.互斥条件资源是独占的且排他使用。进程互斥使用资源,即任一时刻一个资源只能给一个进程使用,其他进程若申请一个资源,而该资源被另一个进程占有时,则申请等待,直到该资源被占用者释放
2.不可剥夺条件进程所获得的资源在未使用完毕之前,不能被其他进程强行剥夺,而只能由获得该资源的进程自愿释放
3.请求与保持条件进程每次申请它所需要的一部分资源,在申请新资源的同时,继续占用已分配到的资源
4.循环等待条件在发生死锁时,必然存在一个进程等待队列(P1,P2,P3….Pn),其中P1等待P2占有的资源,P2等待P1占有的资源,形成了一个进程等待环路。环路中每个进程已占有的资源同时被另一个进程所申请,即前一个进程占有后一个进程所申请的资源
代码模拟死锁1234567891011121 ...
Vue-Day5
上个月,本来是后端程序员的我,被拉上当前端来用,第一次体验到前端的工作,还有人生中第一次加班(连着两周。。)咕咕咕好久的博客了,这次在这里总结一下噩梦18天我学到的东西,知识点可能比较杂碎~
Vue-RouterVue Router是Vue的路由管理器,以下是简单的使用步骤:
首先要把组件映射到路由上(components—>routers):
123456789101112131415161718192021222324252627282930313233import Vue from 'vue'import Router from 'vue-router'import Home from './components/Home'import Users from './components/Users'import MyMusic from './components/MyMusic'Vue.use(Router)export default new Router( ...
volatile关键字
volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile 变量的同步性较差(有时它更简单并且开销更低),而且其使用也更容易出错。
特性被volatile关键字修饰的共享变量具有以下特性
保证了不同线程对该变量操作时的内存可见性
禁止了指令重排序
理解A,B线程都用到了一个变量,Java默认是A运行时保存一份copy到该线程的缓存中,此时如果B线程修改了该变量,则线程A未必知道,因为A线程用的是自己缓存中的该变量的拷贝
使用volatile关键字修饰,会让所有线程读到该变量的修改值,强制线程读取堆内存
123456789101112131415161718192021222324252627282930public class T { //对比一下有无volatile的情况下,整个程序运行结果的区别 /*volatile*/ b ...
synchronized关键字
synchronized关键字的意义为了防止代码块受并发访问的干扰,Java语言提供一个 synchronized关键字达 到这一目的,并且 Java SE 5.0引入了 ReentrantLock 类。synchronized 关键字自动提供一个 锁以及相关的“ 条件”, 对于大多数需要显式锁的情况, 这是很便利的。
synchronized关键字的作用synchronized关键字是对某个对象加锁
举个例子,如以下代码段:
1234567private Object o = new Object();public void m() { synchronized(o) { //任何线程要执行下面的代码,必须先拿到o的锁 count--; System.out.println(Thread.currentThread().getName() + " count = " + count); }}
还有另一种用法
123456public void m() { synchronized(this) ...
Java并发编程1
最近在看Java关于线程的相关知识,看的是马士兵老师的高并发编程系列av11076511,遂把知识点整理下来,便于以后查阅。
线程的创建通过继承Thread类并重写run()方法通过继承Thread类并重写run()方法,run()方法中定义需要线程执行的任务,然后调用实现类的start()方法启动这个线程(ps:单纯的调用run()方法只是单纯的方法使用,并不能达到启动线程的目的)
1234567891011121314151617public class Current extends Thread { public void run() { System.out.println("子线程启动,ID为:" + Thread.currentThread().getId() + ",名字为" + Thread.currentThread().getName()); } public static void main(String[] args) ...