springboot微服务(发现组件Eureka,微服务调用组件Feign)
一.服务发现组件Eureka
SpringCloud之Eureka注册中心原理及其搭建https://www.cnblogs.com/jing99/p/11576133.html
Eureka是Netflix开发的服务发现框架,SpringCloud将它集成在自己的子项目spring-cloud-netflix中,实现
SpringCloud的服务发现功能。Eureka包含两个组件:Eureka Server和Eureka Client。
测试组件Eureka
1.在父工程定义好SpringCloud版本
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.M9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.创建一个Eureka模块并引入依赖eureka-server
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eurekaserver</artifactId>
</dependency>
</dependencies>
3.在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/
4.Eureka模块启动类配置
@SpringBootApplication
@EnableEurekaServer //开启eureka服务端配置
public class EurekaServer {
public static void main(String[] args) {
SpringApplication.run(EurekaServer.class, args);
}
}
5.将其他微服务(这里是springboot项目)注册到Eureka中,这样所有的微服务之间都可以互相调用
5.1>每个微服务模块添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
5.2>修改每个微服务的application.yml,添加注册eureka服务的配置
eureka:
client:
service-url:
defaultZone: http://localhost:6868/eureka
instance:
prefer-ip-address: true
5.3>每个微服务的启动类添加注解@EnableEurekaClient
二.微服务调用组件Feign
简化Java HTTP客户端开发的工具(java-to-httpclient-binder),它的灵感来自于Retrofit、JAXRS-2.0和
WebSocket。Feign的初衷是降低统一绑定Denominator到HTTP API的复杂度,不区分是否为restful
1.A微服务需要调用B微服务的方法,就在A模块添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.修改A模块的启动类,添加注解
@EnableDiscoveryClient
@EnableFeignClients
3.在A模块的包下创建一个接口
//@FeignClient注解用于指定从哪个服务中调用功能 ,注意里面的名称与被调用的服务名保持一致
@FeignClient(value = "B模块服务名")
public interface AmoduleFeignClient {
//@RequestMapping注解用于对被调用的微服务进行地址映射(A模块调用B,Value就是B模块的请求地址)
@RequestMapping(value = "/company/user/{id}/", method = RequestMethod.GET)
public User findById(@PathVariable("id") String id) throws Exception;
}
4.在A模块类下测试调用
@Autowired
private AmoduleFeignClient amoduleFeignClient;
//测试通过系统A微服务调用B微服务方法
@RequestMapping(value = "/test/{id}")
public void findUserById(@PathVariable String id){
User user = amoduleFeignClient.findById(id);
System.out.println(user.getName);
}
5.A微服务调用B微服务时,未携带A请求头里面登录信息(登录信息放请求头里),导致未登录
这时需要配置Feign拦截器添加请求头,使之携带到B微服务
/**
* 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);
}
}
}
}
};
}
}