经过一个多星期的springcloud学习,今天尝试使用springcloud搭建一个比较符合实际开发的综合案例,包括一个分布式系统项目所包含的基本工程:eureka注册中心,注册到eureka的服务客户端client,服务消费者ribbon,配置服务中心spring cloud config,以及网关路由zuul。

####一、搭建注册中心 eureka-server
分析:搭建eureka注册中心主要分以下三点:

1.项目创建时选择的依赖:spring-cloud-starter-eureka-server
2.在项目启动类Application.class上添加@EnableEurekaServer注解表示项目是作为eureka注册中心启动的
3.在配置文件application.xml或application.yml配置相关属性如:注册中心端口,eureka相关配置

注:在默认设置下,eureka的服务注册中心也会将自己作为客户端注册自己,可以在application.properties配置文件中禁用这个功能

注册中心的配置属性:

server.port=1111
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

eureka已经整合了页面功能,启动项目,浏览器访问url:localhost:1111 可以直接查看到注册中心状态。

####二、搭建配置中心 config-server
简单三步走:

1.确认项目依赖:spring-cloud-starter-eureka,spring-cloud-config-server
2.在项目启动类Application.class上添加@EnableConfigServer表示项目已配置服务器启动
3.在配置文件application.xml或application.yml配置相关属性如:服务端口,配置文件路径和账户密码

注:作为配置中心在项目启动的时候会默认自己注册自己,导致项目报错启动不了,需要在配置文件中配置禁止自身注册自己,本项目git仓库为测试仓库,可直接使用测试

配置中心的配置属性:

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false

server:
  port: 8040
spring:
  application:
    name: microservice-config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/eacdy/spring-cloud-study/
          search-paths: config-repo
          username:
          password:

启动项目,可以通过一下url测试是否能够正常获取到git仓库中的配置信息
http://localhost:8040/microservice-config-client-dev.properties
http://localhost:8040/microservice-config-client/dev

####三、搭建客户端服务 eureka-user-client
注册中心搭和配置中心建完了,接下来搭建一个客户端服务,为了贴近实际业务,整合mysql和mybatis实现对数据库操作功能。
按以下功能分析项目:
1.确认项目依赖:
>spring-cloud-starter-eureka-server(eureka注册服务功能)
>mybatis-spring-boot-starter(mybatis)
>mysql-connector-java(mysql)
>spring-boot-starter-web(web功能)

2.项目如果不增加其它功能,启动类Application.class正常启动就行
3.按以下功能分析项目:

(1)作为客户端服务 client并实现注册到eureka功能:
在配置文件application.xml或application.yml配置相关属性:注册中心地址

(2)实现mybatis连接数据库mysql功能:	
1.在配置文件application.xml或application.yml配置相关属性:数据源配置、mybatis配置(指定实体类包路径和mapper文件路径)
2.创建实体类pojo
3.创建dao层,加上注解@Mapper以实现注解注入容器
4.在resources/mapper下的mapper.xml文件(遵循mybatis开发准则,方法名和参数一致)
5.创建相应的service和service实现类,实现类加上注解@Service以实现注解注入容器,使用@Autowried注入dao
6.创建controller类,加上@EnableEurekaClient注解注册服务,使用@Autowried注入service

注册中心属性配置:

eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/

mysql和mybatis属性配置:

## 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/mytest?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

## Mybatis 配置
mybatis.typeAliasesPackage=com.sc.eurekauserclient.pojo
mybatis.mapperLocations=classpath:mapper/*.xml

注:服务在注册中心的注册的服务名称为大写
启动项目,可以看到eureka注册中心多了一个SERVICE-USER服务
输入url:http://localhost:8091/getUserByName?name=张三 可以查看请求是否正常

####四、使用Ribbon和RestTemplate搭建服务消费端 user-ribbon
分析user-ribbon搭建步骤(同时还要实现hystrix熔断器功能):

1.确认项目依赖:

spring-cloud-starter-eureka(注册与消费eureka服务中心服务)
spring-cloud-starter-ribbon(ribbon功能)
spring-cloud-starter-hystrix(hystrix熔断器)
spring-boot-starter-web(web功能)

2.在项目启动类Application.class上添加@EnableDiscoveryClient注册并订阅服务@EnableHystrix开启熔断器功能,同时加上@Bean @LoadBalanced RestTemplate restTemplate(){ return new RestTemplate(); }开启ribbon负载均衡功能。

3.在配置文件application.xml或application.yml配置相关属性:注册中心地址

4.编写service类(ribbon方式实现调用服务和熔断器功能)

1.添加@Service注解实现注入容器
2.@Autowired方式注入RestTemplate,用于调用服务方法
3.调用 restTemplate.getForObject(“http://服务名称/mapper路径”,返回类.class);执行服务方法
4.在方法上使用注解@HystrixCommand(fallbackMethod = “method”)对该方法开启熔断功能并指定熔断的执行方法。
5.在service类声明方法“method”对应 fallbackMethod 指定的熔断方法,编写熔断业务,注意返回值要一致。
6.controller类,@Autowried注入service,调用方法
启动项目,浏览器输入 http://localhost:8093/findCityById?id=3 查看请求是否正常

####五、使用Feign搭建服务消费端 user-feign
除了使用ribbon+restTemplate实现服务调用外,还可以使用feign实现,feign自带熔断器。

分析项目搭建过程:

1.确认项目依赖:

spring-cloud-starter-eureka、spring-cloud-starter-feign、spring-boot-starter-web

2.根据项目定位和功能在项目启动类Application.class添加相应的注解开启功能

@EnableDiscoveryClient 发布和订阅服务
@EnableFeignClients 开启feign功能

3.在配置文件application.xml或application.yml配置相关属性:
注册中心地址

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:1111/eureka/

开启feign熔断器功能

feign.hystrix.enabled=true

4.创建service接口调用服务和熔断功能

类名上添加@FeignClient(value = “SERVICE-USER”,fallback = FeignServiceFallback.class)指定调用的服务名称以及熔断执行类
方法上添加注解@RequestMapping(value = “getCityById”,method = RequestMethod.GET)这个路径与请求方法是@FeignClient的服务的路径和请求

5.创建Fallback类

哪个service开启熔断需要实现对应service接口,可以多实现
在类上添加注解@Component以实现注入容器
重写接口方法已实现熔断业务,注意返回值和参数一致

6.controller调用service接口方法实现服务调用

启动项目,浏览器输入 http://localhost:8092/findCityById?id=3 查看请求是否正常

####六、搭建路由网关项目 service-zuul
一般来说我们不会直接对外提供请求路径,而是通过一个路由网关如zuul对外接受请求,同时但springcloud搭建的服务项目越来越多时,zuul还可以对各个服务进行路由转发,例如 /user/… 转发到user服务器,/case/… 转发到case服务器,zuul还可以作为反向代理和负载均衡功能。

搭建service-zuul项目,对前面的user-ribbon和user-feign进行转发:

1.确认项目依赖:

spring-cloud-starter-eureka(eureka发布和订阅)
spring-cloud-starter-zuul(zuul路由网关)
spring-boot-starter-web(web功能)

2.根据项目定位和功能在项目启动类Application.class添加相应的注解开启功能

@EnableEurekaClient 开启eureka发布和订阅功能
@EnableZuulProxy 开启zuul路由网关功能

3.在配置文件application.xml或application.yml配置相关属性:
注册中心

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:1111/eureka/

zuul相关配置

zuul:
  routes:
    api-a:
      path: /api-a/**
      serviceId: SERVICE-FEIGN
    api-b:
      path: /api-b/**
      serviceId: SERVICE-RIBBON
    api-c:
      path: /userF/**
      serviceId: USER-FEIGN
    api-d:
      path: /userR/**
      serviceId: USER-RIBBON

启动项目,根据USER-FEIGN服务之前的请求 http://localhost:8092/findCityById?id=3
通过zuul请求USER-FEIGN服务输入请求: http://localhost:9003/userF/findCityById?id=3 也可以获取到返回结果

分析项目源码:https://pan.baidu.com/s/1bUYZLG

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐