上篇博客已經爲大家簡單介紹了Spring Cloud Alibaba以及組件Nacos並且實現了服務註冊與發現,接下來本篇博客爲大家介紹兩個實例引入服務發現。
我們已經創建了兩個服務一個是user另一個是content
目錄結構爲:
服務生產者
首先我們在User項目中編寫一個接口(具體實現省略,此處不涉及業務)
@RestController
@RequestMapping("/users")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class UserController {
private final UserService userService;
@GetMapping("/{id}")
public User findById(@PathVariable Integer id) {
return userService.findById(id);
}
}
服務消費者
1.使用RestTemplate方式調用
1.調用地址url 寫死
@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ShareService {
private final RestTemplate restTemplate;
// 第一種利用
UserDTO userDTO = restTemplate.getForObject("http://localhost:8080/users/{id}", UserDTO.class, userId);
//消息裝配
ShareDTO shareDTO = new ShareDTO();
BeanUtils.copyProperties(share,shareDTO);
shareDTO.setWxNickname(userDTO.getWxNickname());
return shareDTO;
}
}
2.利用DiscoveryClient 獲取實例地址
@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ShareService {
private final RestTemplate restTemplate;
private final DiscoveryClient discoveryClient;
public ShareDTO findById(Integer id) {
//用戶中心所有實例的信息
List<ServiceInstance> instances = discoveryClient.getInstances("center-user");
String targetURL = instances.stream().map(instance -> instance.getUri().toString() + "/users/{id}")
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("當前沒有實例"));
//第二種利用discoveryClient 獲取實例
UserDTO userDTO = restTemplate.getForObject(targetURL, UserDTO.class, userId);
//消息裝配
ShareDTO shareDTO = new ShareDTO();
BeanUtils.copyProperties(share,shareDTO);
shareDTO.setWxNickname(userDTO.getWxNickname());
return shareDTO;
}
3. 使用Ribbon調用實現負載均衡
3.1 給RestTemplate添加註解
@Bean
//整合Ribbon 的註解
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
3.2 修改類直接調用
@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ShareService {
private final ShareMapper shareMapper;
private final RestTemplate restTemplate;
private final DiscoveryClient discoveryClient;
public ShareDTO findById(Integer id) {
//獲取分享詳情
Share share = this.shareMapper.selectByPrimaryKey(id);
//發佈人id
Integer userId = share.getUserId();
// 第三種 使用ribbon
String targetURL = "http://center-user/users/{userId}";
UserDTO userDTO = restTemplate.getForObject("http://center-user/users/{userId}", UserDTO.class, userId);
//消息裝配
ShareDTO shareDTO = new ShareDTO();
BeanUtils.copyProperties(share,shareDTO);
shareDTO.setWxNickname(userDTO.getWxNickname());
return shareDTO;
}
}
4.使用feign實現遠程HTTP調用
4.1 引入openfeign依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
4.2 啓動類添加註解 @EnableFeignClients
@MapperScan("com.thyme")
@SpringBootApplication
@EnableFeignClients
public class ContentApplication {
public static void main(String[] args) {
SpringApplication.run(ContentApplication.class, args);
}
}
4.3 新建 CenterUserFeignClient 類
@FeignClient(name = "center-user")
public interface CenterUserFeignClient {
@GetMapping("/users/{id}")
UserDTO findById(@PathVariable Integer id);
}
4.4 修改調用 ShareService類代碼
@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ShareService {
private final ShareMapper shareMapper;
private final CenterUserFeignClient centerUserFeignClient;
public ShareDTO findById(Integer id) {
//獲取分享詳情
Share share = this.shareMapper.selectByPrimaryKey(id);
//發佈人id
Integer userId = share.getUserId();
// 第四種 使用feign實現遠程HTTP 調用
UserDTO userDTO = centerUserFeignClient.findById(userId);
//消息裝配
ShareDTO shareDTO = new ShareDTO();
BeanUtils.copyProperties(share,shareDTO);
shareDTO.setWxNickname(userDTO.getWxNickname());
return shareDTO;
}
}