SpringCloud 集成Zookeeper、Feign
一、引用Spring Cloud Greenwich.SR2
版本
spring cloud 配置文件加载顺序-- boostrap.yml
的优先级高于application.yml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
二、Zookeeper 注册中心 集成
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
三、Feign 负载均衡
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
简介:
Feign是一个声明性web服务客户机。它使编写web服务客户机更容易。要使用Feign创建一个接口并对其进行注释。它具有可插入注释支持,包括伪注释和JAX-RS注释。Feign还支持可插入编码器和解码器。Spring Cloud增加了对Spring MVC注释的支持,并支持使用Spring Web中默认使用的HttpMessageConverters。Spring Cloud集成了Ribbon和Eureka,在使用Feign时提供一个负载均衡的http客户机。
特点:
- 可插拔的注解支持,包括Feign注解和JAX-RS注解;
- 支持可插拔的HTTP编码器和解码器;
- 支持Hystrix和它的Fallback;
- 支持Ribbon的负载均衡;
- 支持HTTP请求和响应的压缩。
- Feign是Netflix开源的轻量级RESTful的HTTP服务客户端
- Feign内置了Ribbon(基于HTTP和TCP的客户端负载均衡工具)
- Feign可以(通过客户端负载均衡的方式)作为客户端,去调用服务注册中心的服务
四、服务端 注册服务
4.1 SpringCloud 和Zookeeper 依赖
<!--spring cloud 引入-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--zookeeper 服务发现 引入-->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
</dependencies>
4.2 开启服务发现和配置参数
@EnableDiscoveryClient #开启服务发现
@SpringBootApplication
@EnableDiscoveryClient
public class CloudProviderApplication {
public static void main(String[] args) {
SpringApplication.run(CloudProviderApplication.class, args);
}
}
application.yml #注册服务到Zookeeper配置中心
server:
port: 8080
spring:
cloud:
zookeeper:
connect-string: 远程服务器IP:2181
application:
name: provider2 #暴露的提供的服务名称,客户端调用此服务时需要用到,命名规则一般是 包名+项目名
4.3 例子,提供的服务 到注册中心Zookeeper
@RestController
public class UserController {
@Autowired
UserInfoService mUserInfoService;
@GetMapping("/getUserInfo/{psnId}")
public R getUserInfo(@PathVariable(name = "psnId") String psnId) {
UserInfoEntity user = mUserInfoService.getUser(psnId);
return R.ok().put("data", user);
}
}
即提供的服务API: http://provider2
/getUserInfo/psnId (provider2
即服务的 host:port
)
五、客户端 注册服务
5.1 SpringCloud 和Zookeeper 依赖
<!--spring cloud 引入-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--zookeeper 服务发现 引入-->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
</dependencies>
5.2 开启服务和配置参数
@EnableDiscoveryClient #开启服务
@SpringBootApplication
@EnableDiscoveryClient
public class CloudComsumerApplication {
public static void main(String[] args) {
SpringApplication.run(CloudComsumerApplication.class, args);
}
}
application.yml #连接Zookeeper配置中心的服务
spring:
cloud:
zookeeper:
connect-string: 远程服务器IP:2181
discovery:
register: false
server:
port: 8081
5.3 例子:获取 Zookeeper配置中心的 服务
在@LoadBalanced注释在RestTemplate 上
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate init() {
return new RestTemplate();
}
}
RestTemplate访问注册中心上提供的服务provider2
对应 服务提供方注册的服务名称
@RestController
public class UserController {
@Autowired
RestTemplate mRestTemplate;
@RequestMapping("/user3/{psnId}")
@ResponseBody
public Response getUser3(@PathVariable(name = "psnId") String psnId) {
return mRestTemplate.getForObject("http://provider2/" + psnId, Response.class);
}
}
即:访问远程服务的API 和服务提供方的 API 格式要一样 对比 4.3暴露的服务API
六、Feign 统一管理客户端 调用远程服务API
客户端不再直接访问远程服务API,统一交给Feign去处理,即访问上相当于增加了一层网关
Feign, 高并发下实现负载均衡,服务降级,流量削峰
-
去掉
@@LoadBalanced
注释,否则可能会报关于负载均衡的错误,因为Feign内置Ribbon负载均衡了 -
@EnableFeignClients
开启Feign
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class CloudComsumerApplication {
public static void main(String[] args) {
SpringApplication.run(CloudComsumerApplication.class, args);
}
}
-
使用
@FeignClient
改造5.3 访问方式
使其更加简洁 -
@FeignClient
name
对应服务提供方提供的服务名称
访问的API 格式和 远程服务器提供的API 格式一摸一样,4.3暴露的API
@FeignClient(name = "provider2")
public interface FeignUserService {
@GetMapping("/getUserInfo/{psnId}")
public FeignResponse remoteUserInfo(@PathVariable(name = "psnId") String psnId);
}
- 访问的方式如下,
@Resource
注释FeignUserService</font>
@RestController
public class FeignUserController {
@Resource
FeignUserService mRemoteUserService;
@GetMapping("/feign/user/{psnId}")
public FeignResponse getFeignUserInfo(@PathVariable("psnId") String psnId) {
return mRemoteUserService.remoteUserInfo(psnId);
}
}