java笔记-类加载

发布在 java

Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能。

阅读全文

说明

使用maven搭建maven仓库,找了网上的一些方法,踩了写坑,鼓捣了大半天终于弄好了,特此记录备忘。
网上基本上有两种方法,但本质上都是一样的,一种是将工程编译到本地,再将本地编译好的jar等文件上传到GitHub。另一种是在pom文件中配置插件,将编译上传使用插件完成。

创建GitHub仓库

在GitHub上创建一个仓库作为个人的maven仓库,以后自己编译后的jar都可以发布到该仓库中,我建立的仓库是maven-repo。
阅读全文

在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring Cloud中,有分布式配置中心组件spring cloud config ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库或svn中。在spring cloud config 组件中,分两个角色,一是config server,二是config client

阅读全文

spring cloud笔记-网关zuul

发布在 java, spring

在Spring Cloud微服务系统中,一种常见的负载均衡方式是,客户端的请求首先经过负载均衡(apache、Ngnix),再到达服务网关(zuul集群),然后再到具体的服。

Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如/api/user转发到到user服务,/api/shop转发到到shop服务。zuul默认和Ribbon结合实现了负载均衡的功能
阅读全文

在上一篇笔记-注册中心中,服务sample只是简单实现了eureka客户端,现在为它添加一个controller

1
2
3
4
5
6
7
8
9
10
11
@Controller
@RequestMapping("/")
public class TestController {
@ResponseBody
@RequestMapping("param")
public Object test(HttpServletRequest request){
Map params = HttpServletUtil.getRequestParameters(request);
params.put("msg","请求成功");
return params;
}
}

这个接口很简单,获取请求参数,在参数Map中加一个msg,然后再原样返回给请求方。

通常来说,请求方可以直接通过ip:port/param?key=value的形式访问sample,但是这样做就跟传统的web项目没区别了,注册中心也就失去了它本来的意义。
阅读全文

最近学习spring cloud,boot+cloud的形式用起来挺不错的,学习过程中试着搭建了一个完整的分布式微服务结构,这个结构由以下组件组成组成

  • eureka server:注册中心
  • config server:配置中心
  • gateway:网关
  • service:服务

spring cloud服务的注册与发现的理论网上一大堆,推荐几篇不错的系列博客

这些博客的写得相当不错,我学习的时候也大多参考这些博客,不过上面博客中的一些例子用的版本相对较老,这里贴出我使用的版本
阅读全文

最近接触spring boot,网上火了好一阵,一开始对这个并不感冒,个人也不是很喜欢将配置写进代码中,所以也就没有去研究它。最近一个项目需要用到spring boot,学习了各路大神的心得后,结合以前的springMVC+spring+mybatis流程,做了一个简单的转换和对比。spring boot这么火热是有道理的,虽然部分配置写进代码,但是非常集中,再也不用在几个配置文件中改来改去,没有一大坨xml配置,jar包运行简直爽。开发热部署极大地提高了开发效率。
阅读全文

springMVC实现多版本接口

发布在 java, spring

最近的一个需求,在现有的系统上实现同一接口的多版本访问,便于以后的接口升级,客户端不改变请求地址,在参数中传递一个version字段指定访问哪个版本的接口。

在前一篇博文 springMVC修改接口注册映射逻辑 中,用修改springMVC注册和映射接口的逻辑实现了该功能,但缺点也很明显,客户端传入的版本号必须在服务端存在,如传入v2.0,则服务端必须存在v2.0版本的接口,否则会抛出404,无法实现降级调用最新接口或默认接口的功能。
阅读全文

最近的一个需求,在现有的系统上实现同一接口的多版本访问,便于以后的接口升级,客户端不改变请求地址,在参数中传递一个version字段指定访问哪个版本的接口。

因为现系统已经在运行,所以改造不能影响已在使用的接口,最开始的设想是建立一个新接口,然后用拦截器拦截请求,组装请求地址+版本号,重定向到新接口,如下:
阅读全文

Goolge-Guava Concurrent中的Service,一般翻译作服务,个人感觉这个太宽泛了,我在学习中就直接把它当做一种特殊的线程托管对象来理解的。

一个服务正常生命周期有:

  • Service.State.NEW
  • Service.State.STARTING
  • Service.State.RUNNING
  • Service.State.STOPPING
  • Service.State.TERMINATED

服务一旦被停止就无法再重新启动了。如果服务在starting、running、stopping状态出现问题、会进入Service.State.FAILED.状态。调用startAsync()方法可以异步开启一个服务,同时返回this对象形成方法调用链。注意:只有在当前服务的状态是NEW时才能调用startAsync()方法,因此最好在应用中有一个统一的地方初始化相关服务。停止一个服务也是类似的、使用异步方法stopAsync()。但是不像startAsync(),多次调用这个方法是安全的。这是为了方便处理关闭服务时候的锁竞争问题。
阅读全文

忘语

热爱生活,享受code


一名虔诚的程序猿