好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Springboot 内部服务调用方式

Eureka注册的服务之间互相调用

1.请求方

启动类添加注解,扫描Eureka 中的全部服务

?

1

2

3

4

5

6

7

8

@SpringBootApplication

@EnableEurekaClient

@EnableFeignClients

public class LoginServiceApplication {    

    public static void main(String[] args) {

        new SpringApplicationBuilder(LoginServiceApplication. class ).web( true ).run(args);

    }    

}

pom.xml 添加包 (版本号 根据实际选择)

?

1

2

3

4

5

< dependency >

    < groupId >org.springframework.cloud</ groupId >

    < artifactId >spring-cloud-starter-feign</ artifactId >

     < version >1.4.6.RELEASE</ version >

</ dependency >

创建接口类

?

1

2

3

4

5

6

7

@FeignClient (name= "hello-service" ) //spring service name

public interface FeignVehicle {

    

     @RequestMapping (value= "/hello" , method = RequestMethod.GET)

     @ResponseBody

     public List<Map> hello( @RequestParam Map<String,String> params);

}

实现类注入此接口类

?

1

2

@Autowired

FeignVehicle feignVehicle;

使用的时候直接按照正常调用方式即可

?

1

2

Map<String,String> map = new HashMap<String, String>();

feignVehicle.hello(map);

跨服务调用的时候出现token信息取不到,在发送方添加拦截器

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

@Configuration

public class FeignConfiguration {

 

    @Bean

    public RequestInterceptor requestInterceptor() {

        return new RequestInterceptor() {

            @Override

            public void apply(RequestTemplate template) { 

                ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder

                        .getRequestAttributes();

                HttpServletRequest request = attributes.getRequest();   //当前服务token

 

                template.header( "Authorization" , "Bearer " + request.getSession().getId()); //template 接收请求方token

            } 

        };

    }

}

2.接收方

请求 启动类

?

1

2

3

4

5

6

7

@SpringBootApplication

@EnableEurekaClient

public class HelloServiceApplication {    

    public static void main(String[] args) {

        new SpringApplicationBuilder(HelloServiceApplication. class ).web( true ).run(args);

    }    

}

请求Controller

?

1

2

3

4

5

6

7

8

9

@Controller

@RequestMapping ( "/hello" )

public class HelloController {    

    @RequestMapping (value= "/hello" ,method = RequestMethod.GET)

    @ResponseBody

    public List<Map> hello( @RequestParam Map<String, String> queryParam) {

        return null ;  

    }

}

多模块化,服务间调用的坑

问题背景

product 服务作为服务端,提供了一个 对外通信Fegin接口 ProductClient,放在了com.imooc.product.client jar包下 order 服务作为客户端,直接引用上面的jar,使用 ProductClient ,启动主类后报下图错误:

解决办法

多模块化时,应该在order主类上添加下面圈出来的注解,这样启动后就能扫描这个包。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://blog.csdn.net/purple25/article/details/88691740

查看更多关于Springboot 内部服务调用方式的详细内容...

  阅读:27次