【Spring Cloud】实战项目搭建
0、项目搭建
创建maven项目,删除其中的src目录,作为整体父项目,在其中添加module实现各个组件。
1、Eureka Server的实现
添加module,创建Spring Boot项目,添加Eureka Discovery Client和Eureka Server依赖,作为Eureka Server。
启动类添加@EnableEurekaServer注释。
修改配置文件application.yml,如下:
1 server: 2 port: 1001 3 4 eureka: 5 client: 6 //是否将自己注册到eureka server上,默认为true 7 //由于本节点为eureka server,设为false 8 registerWithEureka: false 9 //是否从eureka server获取注册信息,默认为true 10 //由于为单点的eureka server,不需要同步信息,设为false 11 fetchRegistry: false 12 //设置与eureka server交互的地址,查询和注册服务都经过这个地址 13 serviceUrl: 14 defaultZone: http://localhost:${server.port}/eureka/
启动项目,即可访问http://localhost:1001/查看eurekaServer管理中心。
2、Service节点
添加module,创建Spring Boot项目,添加Eureka Discovery Client和Eureka Server依赖。
启动类添加@EnableEurekaClient注释(也可用@EnableDiscoveryClient取代,效果相同,前者对应Eureka,后者适用多种注册中心)以及@ComponentScan注释。
修改配置文件application.yml,如下:
1 spring: 2 //服务名称 3 application: 4 name: Service112 13 server: 14 port: 8001 15 16 //在服务中心进行注册 17 eureka: 18 client: 19 serviceUrl: 20 defaultZone: http://localhost:8801/eureka/
配置完成后启动项目,可在eureka管理中心看到注册的服务。
项目中新建service和controller包,controller包中HelloController负责接受请求,并路由到service包中的具体实现,controller中仅注入service对象,然后根据请求路径调用响应的service实现,service中负责具体的实现。
同理,按上面步骤增加第二个Service节点,注册名为Service2,注册在8002端口。
3、服务调用
Sping Cloud由两种消费方式,rest+ribbon和feign两种。
3.1、rest+ribbon调用(通过RestTemplate构造URL调用)
添加module,创建Spring Boot项目,添加Eureka Discovery Client、Eureka Server和Ribbon依赖。
启动类添加@EnableDiscoveryClient和@ComponentScan注释。
修改配置文件application.yml,注册在8003端口上的Service3服务。
service包和controller包同上。
Service3调用Service1和Service2:
启动类中注入RestTemplate对象,添加@LoadBalance、@Bean和@Autowired注释,开启负载均衡。
改造service包中的具体实现:
自动注入(@Autowired)RestTemplate对象,restTemplate.getForObject("http://${注册应用名}/${请求路径}?参数列表",String.class)。
实现远程调用,通过注册应用名自动负载均衡。
3.2、feign调用(通过动态代理的接口来实现接口调用,在接口中实现远程调用)
添加module,创建Spring Boot项目,添加Eureka Discovery Client、Eureka Server和Feign依赖。
启动类添加@EnableDiscoveryClient和@ComponentScan注释。
修改配置文件application.yml,注册在8004端口上的Service4服务。
service包和controller包同上。
Service4调用Service1和Service2:
新增feignRPC包,其中定义两个接口,分别对应两个应用Service1和Service2的调用。
service1_feign接口为:
1 @FeignClients(value = "Service1") //通过应用注册名来调用服务 2 public interface service1_feign() { 3 @RequestMapping(value = "/${请求路径}", method = RequestMethod.GET) 4 public String getHello(@RequestParam("service1中参数名") 具体参数); 5 }
改造service包中的具体实现:
自动注入(@Autowired)service1_feign接口,像调用本地方法那样调用接口的方法即可实现远程调用。
Feign集成了Ribbon,通过注册应用名自动负载均衡。
4、体验负载均衡机制
创建module,普通的service节点,注册在8005端口,应用名为Service1。
在eureka server管理界面可以看到Service1有两个服务提供者提供同名应用。
通过Service3或者Service4调用应用名为Service1的服务。
由于Ribbon默认的负载均衡策略为轮询,通过刷新界面,可以看到一次调用module1和module5提供的服务。
5、网关Zuul的搭建
5.1、体验网关的请求转发功能
创建module,添加Eureka Discovery Client、Eureka Server和Zuul依赖。
启动类添加@EnableZuulProxy注释。
修改配置文件application.yml,注册在6001端口上,注册应用名为zuul。
启动项目后,可以通过网关访问服务:
直接http://localhost:8001/hello?name=world可以访问Service1;
通过网关转发,http://localhost:6001/Service1/hello?name=world访问Service1应用,Zuul默认实现了按应用名负载均衡。
5.2、网关的自定义路由
在application.yml配置文件中配置:
1 zuul: 2 //前缀,请求路径前必须加 3 prefix: /api 4 //自定义路由 5 routes: 6 Service1: /service_1_zuul/** 7 //禁止直接访问后台服务 8 ignored-services: Service1
启动项目后,访问http://localhost:8001/hello?name=world失败,网关禁止直接调用后台服务Service1。
通过网关访问http://localhost:6001/api/service_1_zuul/hello?name=world,可以轮询调用Service1和Service5。