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);
                       }
                   }
               }
           }
       };
   }
}

posted @ 2020-12-18 11:20  lost_s  阅读(423)  评论(0编辑  收藏  举报