Eureka(服务发现组件)
1、什么是服务发现?
2、服务发现方式
3、服务发现组件 Eureka
Eureka
是
Netflflix
开发的服务发现框架,
SpringCloud
将它集成在自己的子项目
spring-cloud-netflflix
中,实现
SpringCloud
的服务发现功能。
Eureka
包含两个组件:
Eureka Server
和
Eureka Client
。
- Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中 的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
- Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就别一个内置的、使用轮 询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒, 如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个 服务节点移除(默认90秒)。
3.1、Eureka服务端开发
(
1
)创建
ihrm_eureka
模块
(
2
)引入依赖 父工程
pom.xml
定义
SpringCloud
版本
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
(3)ihrm_eureka模块pom.xml引入eureka-server
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eurekaserver</artifactId>
</dependency>
</dependencies>
(4)ihrm_eureka模块添加application.yml
server:
port: 6868 #服务端口
eureka:
client:
registerWithEureka: false #是否将自己注册到Eureka服务中,本身就是所有无需
注册
fetchRegistry: false #是否从Eureka中获取注册信息
serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址
defaultZone: http://127.0.0.1:${server.port}/eureka/
(5)ihrm_eureka模块配置启动类
@SpringBootApplication
@EnableEurekaServer
public class EurekaServer {
public static void main(String[] args) {
SpringApplication.run(EurekaServer.class, args);
}
}
3.2、Eureka客户端(微服务注册)
我们现在就将所有的微服务都注册到
Eureka
中,这样所有的微服务之间都可以互相调用了。
(1)将客户端(即调用服务模块)的pom.xml添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
(
2
)修改每个微服务的
application.yml
,添加注册
eureka
服务的配置
eureka:
client:
service-url:
defaultZone: http://localhost:6868/eureka
instance:
prefer-ip-address: true
(
3
)修改每个服务类的启动类,添加注解
@EnableEurekaClient
Feign与Ribbon负载均衡的区别
简单的说,ribbon是直接通过微服务的地址调用服务,Feign是通过调用接口来进行调用服务
Ribbon(客户端负载均衡器)
(1).导入maven
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
(2).创建一个RestBean注入RestTemplate,不直接注入到controller层的原因是:我们还会为RestTemplate注入其他的属性
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
//这个注解表示将这个类注入到spring boot的容器中
@Configuration
public class RestBean {
@Bean
@LoadBalanced
//这个注解是Ribbon使用负载均衡的注解
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
(3).创建controller层,调用生产者服务
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.List;
@RestController
public class RibbonController {
//此处的请求前缀是微服务提供者的服务名称,相当于localhost:8080
private static final String producter_url = "http://productor";
/**
* 使用 使用restTemplate访问restful接口非常的简单粗暴无脑。 (url, requestMap,
* ResponseBean.class)这三个参数分别代表 REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。
*/
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/consumer/dept/list")
public List<String> list()
{
return restTemplate.getForObject(producter_url + "/show", List.class);
}
}
Feign(微服务调用组件)
Feign
是简化
Java HTTP
客户端开发的工具(
java-to-httpclient-binder
),它的灵感来自于
Retrofifit
、
JAXRS-2.0
和
WebSocket
。
Feign
的初衷是降低统一绑定
Denominator
到
HTTP API
的复杂度,不区分是否为
restful
1、使用体验
我们现在在系统微服务调用企业微服务的方法(根据
ID
查询部门)
(1
)在
ihrm_system
模块添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency
(
2
)修改
ihrm_system
模块的启动类,添加注解
@EnableDiscoveryClient
@EnableFeignClients
(
3
)在
Ihrm_system
模块创建
com.ihrm.system.client
包,包下创建接口
//@FeignClient注解用于指定从哪个服务中调用功能 ,注意里面的名称与被调用的服务名保持一致
@FeignClient(value = "ihrm-company")
public interface DepartmentFeignClient {
//@RequestMapping注解用于对被调用的微服务进行地址映射
@RequestMapping(value = "/company/departments/{id}/", method = RequestMethod.GET)
public Department findById(@PathVariable("id") String id) throws Exception; }
(
4
)修改
Ihrm_system
模块的
UserController
@Autowired
private DepartmentFeignClient departmentFeignClient;
//测试通过系统微服务调用企业微服务方法
@RequestMapping(value = "/test/{id}")
public void findDeptById(@PathVariable String id){
Department dept = departmentFeignClient.findById(id);
System.out.println(dept);
}
(
5
)ihrm_common配置
Feign
拦截器添加请求头
注:为什么要加Feign拦截器呢?
/**
* FeignConfiguration 过滤器,配置请求头信息
*/
@Configuration
public class FeignConfiguration {
@Bean
public RequestInterceptor requestInterceptor() {
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate template) {
ServletRequestAttributes attributes = (ServletRequestAttributes)
RequestContextHolder
.getRequestAttributes();
if (attributes != null) {
HttpServletRequest request = attributes.getRequest();
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) {
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
String values = request.getHeader(name);
template.header(name, values);
}
}
}
}
};
}
}