Loading

【Spring Cloud】实战项目搭建

0、项目搭建

创建maven项目,删除其中的src目录,作为整体父项目,在其中添加module实现各个组件。

1、Eureka Server的实现

添加module,创建Spring Boot项目,添加Eureka Discovery ClientEureka 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 ClientEureka 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 ClientEureka ServerRibbon依赖。

启动类添加@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 ClientEureka ServerFeign依赖。

启动类添加@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。

6、Eureka Server集群

7、熔断降级功能

posted @ 2019-09-25 11:22  H-utopia  阅读(920)  评论(0编辑  收藏  举报