先在一个项目的controller中写入一个接口:
他的应用名字为server:
spring:
application:
name: server
但其实打开eureka看到的是SERVER大写的。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
开启第二个项目:来调用第一个项目中的接口
第一种方式:直接调用
RestTemplate restTemplate=new RestTemplate();
String msg=restTemplate.getForObject("http://localhost:8080/server/msg",String.class);
log.info("msg:{}",msg);
第二种方式:采用LoadBalanceClient。
如果对方开多个项目一,搞了个集群,那么用LoadBalanceClient,是客户端默认采用轮询的方式,给你选出一个,进行调用。这里的意思是,给我这个应用的名字,如果开了多个这个应用(这里指的是SERVER应用,也就是指我的项目一),那么它选出一个给我。我用getHost和getPort就可以知道它给我的是哪个,然后用RestTemplate调用。
ServiceInstance serviceInstance=loadBalancerClient.choose("SERVER");
String url= String.format("http://%s:%s/server/msg",serviceInstance.getHost(),serviceInstance.getPort());
RestTemplate restTemplate=new RestTemplate();
String msg=restTemplate.getForObject(url,String.class);
log.info("msg:{}",msg);
第三种方式:对第二种方式的简单处理:
这里是把RestTemplate 进行加工后,再给spring处理:
于是在controller中调用即可:
先注入restTemplate
@Resource
private RestTemplate restTemplate;
然后调用:
String msg=restTemplate.getForObject("http://SERVER/server/msg",String.class);
log.info("msg:{}",msg);
host和port直接变成application name即可(SERVER):
简单说下@Bean注解和@Resource
而@Resource注入的时候看的是名字,是属性的名字,而不是看类
这里:我是把它当成bean交给了spring:
所以我在这里定义成员属性的时候就必须写一样的名字:
依赖:这里很坑,要看版本,我这里是新的,如果用了旧的maven会报红、这里有升级后的依赖:很全:[升级后的依赖],(https://zhuanlan.zhihu.com/p/111927645)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
启动类加注解:@EnableFeignClients
写个接口类调用api:(这里有个坑!!不要把接口类的名字设置为FeignClient,因为这个与本身的FeignClient重名了,会导致错误!!)
@FeignClient(name = "server")
public interface Client {
@GetMapping("/server/msg")
String msg();
@GetMapping("/server/category")
List<ProductCategory> category();
}
@FeignClient(name = “server”)是指定application name,项目一设置的就是sever。
再后面就是项目一配置的controller中的@RequestMapping了。
然后在controller中把刚刚写的interface注入:
用feign调用接口