Spring Cloud 入门笔记
在微服务架构中,需要几个基础的服务治理组件:服务注册与发现(Eureka-server
)、服务消费(Eureka-Client
)、负载均衡(Ribbon
)、断路器(Hystrix
)、智能路由(Zuul
)、配置管理(config-server
)
-
Eureka-server
-
一个服务注册中心,服务都需要注册到它的容器里。它维护一个类似于路由表的表,服务注册后会将其名字以及访问地址记录在这张表中,所有注册在这个服务中心里的服务可以根据 服务名字 来访问服务。
-
创建步骤
- 要在启动程序加入
@EnableEurekaServer
注解 - 要在
application.yml
中配置
server: port: 8761 eureka: instance: hostname: localhost client: registerWithEureka: false // 这两项说明这是一个server fetchRegistry: false serviceUrl: //因为默认情况下,eureka server也是一个client,所以也需要指定url defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
- 要在启动程序加入
-
-
Eureka-Client
-
一个处理外界请求的客户端,相当于
Controller
-
创建步骤
- 要在启动程序加入
@EnableEurekaClient
注解 - 要在
application.yml
中配置
eureka: client: serviceUrl: //注册中心的地址 defaultZone:{eureka-server-url} server: port: 8762 //暴露给外界的端口 spring: application: name: {service-name} //这个必须指定,因为服务与服务之间的相互调用(RPC)都是根据这个name
- 要在启动程序加入
-
-
小结
- 启动要加入相应的注解,以便标识这是一个
client
还是server
server
的配置文件关键要配置eureka.instance.registerWithEureka: false
以及eureka.instance.fetchRegistery: false
client
的配置文件关键要配置port
application.name
以及eureka-server.url
- 启动要加入相应的注解,以便标识这是一个
-
ribbon
ribbon
是eureka-client
的一种,它具有负载均衡的能力。- 启动程序中要有
@EnableDiscoveryClient
向服务中心注册,并向ioc容器注入一个bean:restTemplate
并通过@LoadBalanced
注解标明开启负载均衡功能
@SpringBootApplication @EnableDiscoveryClient public class ServiceRibbonApplication { public static void main(String[] args) { SpringApplication.run(ServiceRibbonApplication.class, args); } @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } }
Service
类要自动装配刚才注入的Bean
,并提供访问url
@Service public class HelloService { @Autowired RestTemplate restTemplate; //ribbon 使用 熔断器可加下面这句 // @HystrixCommand(fallbackMethod = "hiError") public String hiService(String name) { // ribbon 会根据 SERVICE-HI 来选择具体的服务示例 // 为什么还要另外一个Service?可以当作两个服务,一个是负载均衡服务(对外--service),另外一个是实际的服务(对内-- Mapper),而Spring Cloud服务之间是以RPC的形式调用的 return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class); } public String hiError(){...} }
Controller
类则直接调用service
类就好
-
Feign
Feign
已经融合了Ribbon+RestTemplate
,即本身就有负载均衡的功能,它还有熔断器的功能。它主要用来发起服务之间的请求的。- 配置文件与配置
Clien
一样 - 启动类要再加上
@EnableFeignClient
注解 - 通过
interface
接口与 服务Client 对接,如
@FeignClient(value = "service-hi") public interface SchedualServiceHi { @RequestMapping(value = "/hi",method = RequestMethod.GET) String sayHiFromClientOne(@RequestParam(value = "name") String name); }
-
熔断器
Hystrix
- 当一个服务client因为意外挂掉了,调用它的服务就会一直等待它的响应而导致线程资源被消耗,所以需要有熔断器以防止服务器资源被耗尽,就好像Web项目错误时要指定错误页一样
- 依赖要加上:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> <dependency> <groupId>com.netflix.hystrix</groupId> <artifactId>hystrix-javanica</artifactId> <version>RELEASE</version> </dependency>
- 在
ribbon
启动类要加上@EnableHystrix
注解开启Hystrix ,而feign
则需要在yml
文件中配置feign.hystrix.enabled: true
- 在
Service
接口指定fallback
指定类即可
@FeignClient(value = "service-hi",fallback = SchedualServiceHiHystric.class) public interface SchedualServiceHi { @RequestMapping(value = "/hi",method = RequestMethod.GET) String sayHiFromClientOne(@RequestParam(value = "name") String name); }
// 注册到ioc容器,才能找到 @Component public class SchedualServiceHiHystric implements SchedualServiceHi { @Override public String sayHiFromClientOne(String name) { return "sorry "+name; } }
-
小结
-
@Resitory
@Component
@Controller
@Service
的区别注解 含义 备注 @Component
最普通的组件,可以被注入到spring容器进行管理 以下三个注解都是属于 @Component
的一种@Repository
作用于持久层 会给方法自动的加上一个后置处理器,万一出现错误则转变成Spring 统一的Exception @Service
作用于业务逻辑层 用于标明这个是一个业务逻辑层,其他与 @Component
没有区别@Controller
作用于表现层(spring-mvc的注解)
-
-
Zuul
路由-
路由的作用是统一管理各种服务,根据路由表转发请求给其他服务,对外暴露统一的服务
url
,调用者(如前端)无需知道服务具体的url
只需要调用统一的接口url
即可,如/api/
-
zuul
路由还有过滤器的作用,可以在路由期间进行一系列动作时刻 filterType 路由之前 pre
路由之时 routing
路由之后 post
发送错误调用 Error
-
设置过滤器需要继承
ZuulFilter
抽象父类,并实现以下方法方法 含义 取值 filterType
触发后,在什么时候过滤(执行) 如上表 filterOrder
执行的优先度 Interger
shouldFilter
什么情况下会触发这个过滤器 方法,可用判断来识别,返回 true
则过滤run
过滤器的具体动作,即执行内容 方法,如判断要不要转发,写入日志等动作
-
-
配置中心
-
由于配置文件在
Spring Cloud
中起到非常重要的作用,所以可以将其作为一个服务来部署在服务器上,以便我们可以进行维护,但是如果想实现热更新,则需要安装rabbitmq
插件。 -
config-server
- 作为一个git仓库的取用者,供调用者使用。一个
config-server
只能从一个数据源取配置文件,因此,如需从不同的源取得不同的配置文件,则需要配置相对应的config-server
- 其配置文件模板如下:
spring.application.name=config-server server.port=8888 spring.cloud.config.server.git.uri=https://github.com/forezp/SpringcloudConfig/ spring.cloud.config.server.git.searchPaths={directory} // 从哪个文件夹取,无则不填,无需加 #注册到eureka 中,以便各种服务能够知道相应的配置中心地址 eureka.client.serviceUrl.defaultZone=http://localhost:8889/eureka/ spring.cloud.config.label=master // 从哪个分支 spring.cloud.config.server.git.username= //如为私有库,则写 spring.cloud.config.server.git.password=
- 作为一个git仓库的取用者,供调用者使用。一个
-
config-client
-
角色是需要获取 配置文件的微服务
-
~~~角色是暴露给外界的
url
,因为外界都通过这个来获得配置文件(?) ~~~ -
可以在配置文件中指明自己需要的文件
#以下指定 spring.application.name=config-client spring.cloud.config.label=master spring.cloud.config.profile=dev eureka.client.serviceUrl.defaultZone=http://localhost:8889/eureka/ spring.cloud.config.discovery.enabled=true #从配置中心读取文件 spring.cloud.config.discovery.serviceId=config-server //根据serviceId取得IP地址,由于根据id,所以可以实现负载均衡 server.port=8881
-
config-client
会在Springboot
初始化时请求以下配置文件,如发现则使用该配置文件进行配置,如果与本地配置文件有重复,则以 线上配置文件 为准。1. /{application}/{profile}[/{label}] 2. /{application}-{profile}.yml 3. /{label}/{application}-{profile}.yml 4. /{application}-{profile}.properties
-
-
当
pom.xml
中依赖了spring-boot-starter-config
时,它会默认从 8888 端口获取引导程序而忽略本地的application.yml
,如需改变这个端口,可以在bootstrap.yml
中定义端口,并设置spring.cloud.config.enabled: false(默认为 true)
;或者在这个文件中定义eureka
注册中心的地址,并说明自己需要的配置文件。 -
关于配置文件的热更新,要在
config-client
的配置文件加上management.endpoints.web.exposure.include= bus-refresh
并且,访问的是/actuator/bus-refresh
, 使用的是POST
请求。
-
-
知识点:
bootstrap.yml
与application.yml
的区别-
bootstrap
会优先与application
加载 -
我的理解;
bootstrap.yml
主要区别于application.yml
的地方是,前者可以在初始化之前去请求外部配置资源来 引导 主程序。同时如果不需要引导程序(如从网络请求配置文件),则可以使用spring.cloud.bootstrap.enabled=false
-