微服务框架学习笔记(1)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
定义一个f eign接口,通过@ FeignClient (“服务名”),来指定调用哪个服务。比如在代 码中调用了service-hi服务的“/hi”接口,代码如下: 1 /** 2 * Created by fangzhipeng on 2017/4/6. 3 */ 4 @FeignClient (value = "service-hi") 5 public int erf ace SchedualServiceHi { 6 @Request Mapping(value = "/hi",met hod = Request Met hod.GET ) 7 St ring sayHiFromClient One(@Request Param(value = "name") St ring name);
写一个测试类HelloService,通过之前注入ioc容器的rest T emplat e来消费service-hi服务 的“/hi”接口,在这里我们直接用的程序名替代了具体的url地址,在ribbon中它会根据服务名 来选择具体的服务实例,根据服务实例在请求的时候会用具体的url替换掉服务名,代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 @Service public class HelloService { @Aut owired Rest T emplat e rest T emplat e; public St ring hiService(St ring name) { ret urn rest T emplat e.get ForObject ("ht t p://SERVICE-HI/hi? name="+name,St ring.class); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@SpringBootApplication @EnableDiscoveryClient public class ServiceRibbonApplication { public static void main(String[] args) { SpringApplication.run(ServiceRibbonApplication.class, args); } @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } }
8 } 9 10 11
在Web层的cont roller层,对外暴露一个”/hi”的API接口,通过上面定义的Feign客户端 SchedualServiceHi 来消费服务。代码如下:
1 2 3 4 5 6 7 8 9 10
@RestController public class HiController { @Autowired SchedualServiceHi schedualServiceHi; @RequestMapping(value = "/hi",method = RequestMethod.GET) public String sayHi(@RequestParam String name){ return schedualServiceHi.sayHiFromClientOne(name); } }
仅仅@EnableEurekaClient 是不够的,还需要在配置文件中注明自己的服务注册中心的地 址,applicat ion.yml配置文件如下:
1 2 3 4 5 6 7 8 9
eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ server: port: 8762 spring: application: name: service-hi
配置管理:
在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以 需要分布式配置中心组件。在Spring Cloud中,有分布式配置中心组件spring cloud config , 它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git 仓库中。在spring cloud config 组件中,分两个⻆色,一是config server,二是config client 。 在程序的入口Applicat ion类加上@EnableConfigServer注解开启配置服务器的功能,代码 如下:
服务网关:zuul
Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如/api/user转发 到到user服务,/api/shop转发到到shop服务。zuul默认和Ribbon结合实现了负载均衡的功 能。 新建springboot 工程,通过在入口applicat on类加上注解@EnableZuulProxy,开启zuul的 功能,zuul网关也需要在注册中心配置,路由功能需要在applicat on.yml或者 applicat on.propert ies
服务调用:Feign
Feign默认集成了ribbon,并和Eureka结合,默认实现了负载均衡的效果。并和Eureka结 合,默认实现了负载均衡的效果。 Feign 采用的是基于接口的注解。 新建一个springboot 工程,在程序的启动类ServiceFeignApplicat ion ,加上 @EnableFeignClient s注解开启Feign的功能: 1 2 3 4 5 6 7 8 9 10 11 @SpringBoot Applicat ion @EnableDiscoveryClient @EnableFeignClient s public class ServiceFeignApplicat ion { public st at ic void main(St ring[] args) { SpringApplicat ion.run(ServiceFeignApplicat ion.class, args); }
微服务框架学习笔记
在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现、服务消费、负载 均衡、断路器、智能路由、配置管理等,由这几个基础组件相互协作,共同组建了一个简单的 微服务系统。一个简单的微服务框架图,如图所示:
spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发 现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。 spring cloud是基于springboot 的,所以需要开发中对springboot 有一定的了解。
eureka server 是有界面的,启动工程,打开浏览器访问: ht t p://localhost :8761 ,界面如下:
服务注册:Eureka Client
当client 向server注册时,它会提供一些元数据,例如主机和端口,URL,主⻚等。 Eureka server 从每个client 实例接收心跳消息。 如果心跳超时,则通常将该实例从注册server 中删除。 通过注解@EnableEurekaClient 表明自己是一个eurekaclient .
4 eureka: 5 inst ance: 6 host name: localhost 7 client : 8 regist erWit hEureka: f alse 9 f et chRegist ry: f alse 10 serviceUrl: 11 def ault Zone: ht t p://${eureka.inst ance.host name}:${server.port }/eureka/ 12
启动工程,打开注册中心,服务已经注册到注册中心,如下:
服务调用:rest+ribbon
在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于ht t p resБайду номын сангаас f ul的。Spring cloud有两种服务调用方式,一种是ribbon+rest T emplat e,另一种是 f eign。在这一篇文章首先讲解下基于ribbon+rest ribbon是一个负载均衡客户端,可以很好的控制ht t 和t cp的一些行为。 新建一个springboot 工程,配置applicat ion中的注册中心,通过@EnableDiscoveryClient 向服务中心注册;并且向程序的ioc注入一个bean: rest T emplat e;并通过@LoadBalanced注解 表明这个rest Remplat e开启负载均衡的功能。
zuul:网关
a. 动态路由 b. 过滤器
微服务框架消息流:
服务发现:注册中心Eureka Server
我们需要用的的组件上Spring Cloud Net flix的Eureka ,eureka是一个服务注册和发现模 块。 启动一个服务注册中心,只需要一个注解@EnableEurekaServer,这个注解需要 springboot 工程的启动applicat ion类上加: 1 2 3 4 5 6 7 8 9 @EnableEurekaServer @SpringBoot Applicat ion public class EurekaserverApplicat ion { public st at ic void main(St ring[] args) { SpringApplicat ion.run(EurekaserverApplicat ion.class, args); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
@SpringBootApplication @EnableEurekaClient @RestController public class ServiceHiApplication { public static void main(String[] args) { SpringApplication.run(ServiceHiApplication.class, args); } @Value("${server.port}") String port; @RequestMapping("/hi") public String home(@RequestParam String name) { return "hi "+name+",i am from port:" +port; } }
1 2 3 4 5 6 7 8
@SpringBootApplication @EnableConfigServer public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); } }
微服务框架技术栈:
springboot:spring框架 Eureka:服务治理
a. 服务注册与发现
Feign:Java Http Clients
a. 服务内部调用
Ribbon:客户端负载均衡器
a. 负载均衡 b. 容错 c. 多协议(HT T P,T CP,UDP)支持异步和反应模型 d. 缓存和批处理
}
eureka是一个高可用的组件,它没有后端缓存,每一个实例注册之后需要向注册中心发送 心跳(因此可以在内存中完成),在默认情况下erureka server也是一个eureka client ,必须要 指定一个 server。eureka server的配置文件appicat ion.yml: 1 server: 2 port : 8761 3