配置环境
父目录
<dependencyManagement>
<dependencies>
<!--Spring Cloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
子目录
<!--熔断器 hystrix依赖,主要是用 @HystrixCommand -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<!--服务注册-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--服务调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
配置了两个module 具体如下 # 服务端口 server.port=8003 # 服务名 spring.application.name=service-ucenter# 端口号 server.port=8004 # 服务名称 spring.application.name=service-message
Nacos注册
在两个模块的启动类上 都加上
@FeignClient注解用于指定从哪个服务中调用功能 ,名称与被调用的服务名保持一致。 @GetMapping注解用于对被调用的微服务进行地址映射。
@SpringBootApplication
@MapperScan("com.xxx.kpopcenter.mapper")
@EnableDiscoveryClient //nacos注册启动 nacos用来注册
@EnableFeignClients //feign启动 feign用来调用
public class UcenterMemberApplication {
public static void main(String[] args) {
SpringApplication.run(UcenterMemberApplication.class,args);
}
}
此时访问http://localhost:8848/nacos 账号密码都是nacos
发现两个服务都已经在nacos中注册 之后就可以通过feign来调用另一个模块里面的方法
Feign 方法调用
1.被调用模块
只需要正确的写出对应的方法和api
// 给feign调用 根据memberId返回member信息
@GetMapping("getMemberInfoById/{memberId}")
public Map<String,String> getMemberMapInfoById(@PathVariable String memberId){
UcenterMember member = memberService.getById(memberId);
Map<String,String> membermap = new HashMap<>();
membermap.put("memberId",member.getId());
membermap.put("nickname",member.getNickname());
membermap.put("avatar",member.getAvatar());
return membermap;
}
2.调用模块
@FeignClient注解用于指定从哪个服务中调用功能 ,名称与被调用的服务名保持一致
@PathVariable注解一定要指定参数名称,否则出错
@Component注解防止,在其他位置注入CodClient时idea报错
@GetMapping注解用于对被调用的微服务进行地址映射 地址一定要写全
Feign类编写 fallback就是配置熔断器(熔断器也可以不写) @Component @FeignClient(value = "service-ucenter",fallback = MemberDegradedFeignClient.class) public interface MemberClient { // 调用nacos服务中的service-ucenter中的方法 根据memberId获取member信息 @GetMapping("/usercenter/member/getMemberInfoById/{memberId}") public Map<String,String> getMemberMapInfoById(@PathVariable("memberId") String memberId); }熔断器编写 就是为了防止调用的方法出现问题
@Component public class MemberDegradedFeignClient implements MemberClient{ @Override public Map<String, String> getMemberMapInfoById(String memberId) { System.out.println("time out"); return null; } }最后方法的调用
@Autowired private MemberClient memberClient; 就可以使用里面的方法了