Spring Cloud Alibaba 教程(基於首個畢業版)(二):使用Nacos引入服務發現

上篇博客已經爲大家簡單介紹了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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章