Verwenden Sie Feign, um deklarative REST-Aufrufe zu implementieren

Verwenden Sie Feign, um deklarative REST-Aufrufe zu implementieren

Zurück: Springcloud-Authentifizierungssicherheit
Weiter: Feigns Unterstützung für die Komprimierung

Wir stellen Fegin vor

Im vorherigen Beispiel wird RestTemplate zum Implementieren von REST-API-Aufrufen verwendet. Der Code lautet ungefähr wie folgt:

	@RequestMapping("user/{id}")
    public User findById(@PathVariable("id") Integer id){
    
    
    	User user = restTemplate.getForObject("http://provider/user/"+id, User.class);
        return user;
    }

Wir konstruieren die URL durch Verketten von Zeichenfolgen, und die URL hat nur einen Parameter. In der Realität enthält die URL jedoch häufig mehrere Parameter. Wenn die URL zu diesem Zeitpunkt auf diese Weise erstellt wird, wird sie sehr ineffizient und schwierig zu pflegen. Sie möchten beispielsweise eine URL wie folgt anfordern:

http: // localhost: 8010 / search? name = 张三 & username = account1 & age = 20

Hier enthält die URL nur 3 Parameter. Wenn die URL komplexer ist, z. B. mehr als 10 Parameter, ist der Code nur schwer zu pflegen.

Integrieren Sie Feign für Verbraucher

1 Fügen Sie in pom.xml eine Feign-Abhängigkeit hinzu

    <!--springboot1.5.9版本适用-->
    <!--
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-feign</artifactId>
                <version>1.4.7.RELEASE</version>
            </dependency>
    -->
      <!--springboot 2.1版本适用 -->
    <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
        <version>2.1.3.RELEASE</version>
    </dependency>

2 Erstellen Sie eine Feign-Schnittstelle und fügen Sie die Annotation @FeignClent hinzu.
Die Schnittstelle entspricht der Methode des Anbieters.

import com.itzz.springcloudconsumer.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@FeignClient(name = "provider")
@Component
public interface UserFeignClient {
    
    
    @RequestMapping("user/{id}")
    public User findById(@PathVariable(value = "id") Integer id);
}

3 Ändern Sie den Controller so, dass er die Feign-Schnittstelle aufruft und die UserFeignClient-Schnittstelle
automatisch einfügt. Die Schnittstelle ruft die findById-Methode auf

@RestController
public class UserController {
    
    
    @Autowired
    private UserFeignClient userFeignClient;
    @Autowired
    private RestTemplate restTemplate;
    @Value("${user.userServiceUrl}")
    private String userServiceUrl;
    @RequestMapping("user/{id}")
    public User findById(@PathVariable("id") Integer id){
    
    
//        return restTemplate.getForObject("http://provider/user/"+id, User.class);
//        return restTemplate.getForObject(userServiceUrl+id,User.class);
        return userFeignClient.findById(id);
    }
}

4 Ändern Sie die Startklasse und fügen Sie ihr die Annotation @EnableFeignClients hinzu.

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class SpringcloudConsumerApplication {
    
    
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
    
    
        return new RestTemplate();
    }

    /**自定义配置ribbon负载均衡算法
     * @return
     */
    @Bean
    public IRule myRule(){
    
    
//        return new RoundRobinRule();//轮询
        return new RandomRule();
//        return new RetryRule();//重试

//        return new BestAvailableRule();
    }

    public static void main(String[] args) {
    
    
        SpringApplication.run(SpringcloudConsumerApplication.class, args);
    }

}

5 Testen Sie das Consumer-Projekt und starten
Sie es neu. Wenn Sie darauf zugreifen können, gibt es kein Problem.
Fügen Sie hier eine Bildbeschreibung ein

REST-Aufruf mit mehreren Parametern in der URL

Hinzufügen einer URL-Methode mit mehreren Parametern zum Anbieter
Eine ist der erholsame Stil und die andere ist die normale Methode zum Übergeben von Parametern, wie unten gezeigt:


import com.itzz.springcloudprovider.dao.UserRepository;
import com.itzz.springcloudprovider.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.jws.soap.SOAPBinding;
import java.util.List;


@RestController
public class UserController {
    
    
    @Autowired
    private UserRepository userRepository;
    @GetMapping("user/{id}")
    public User findById(@PathVariable(value = "id") Integer id){
    
    
        return userRepository.getOne(id);
    }
    //restful传多个参
    //http://localhost:8000/search/1/张三/zhangsan
    @GetMapping("search/{id}/{username}/{name}")
    public User search(@PathVariable(value = "id") Integer id,@PathVariable("username") String username,@PathVariable("name") String name){
    
    
        return userRepository.getOne(id);
    }
    //http://localhost:8000/search2?id=1&username=zhangsan&name=张三
    @GetMapping("search2")
    public User search2(Integer id,String username,String name){
    
    
        return userRepository.getOne(id);
    }

}

2 Fügen Sie die relevante Schnittstelle zur UserFeignClient-Oberfläche des Consumer-Projekts hinzu.

	//restful传多个参
    @RequestMapping("search/{id}/{username}/{name}")
    public User search(@PathVariable(value = "id") Integer id,@PathVariable("username") String username,@PathVariable("name") String name);
    @RequestMapping("search2")
    public User search2(@RequestParam("id") Integer id, @RequestParam("username") String username, @RequestParam("name") String name);

Hinweis: Scheinschnittstelle: Wenn mehrere Parameter vorhanden sind, müssen Sie den Parameternamen über die Annotation @RequestParam angeben.
3 Implementieren Sie das Aufrufen von UserFeignClient-bezogenen Schnittstellen im Controller des Verbrauchers

@RestController
public class UserController {
    
    
    @Autowired
    private UserFeignClient userFeignClient;
    @Autowired
    private RestTemplate restTemplate;
    @Value("${user.userServiceUrl}")
    private String userServiceUrl;
    @RequestMapping("user/{id}")
    public User findById(@PathVariable("id") Integer id){
    
    
//        return restTemplate.getForObject("http://provider/user/"+id, User.class);
//        return restTemplate.getForObject(userServiceUrl+id,User.class);
        return userFeignClient.findById(id);
    }
    @RequestMapping("search/{id}/{username}/{name}")
    public User search(@PathVariable("id") Integer id,@PathVariable("username") String username,@PathVariable("name") String name){
    
    
        return userFeignClient.search(id, username, name);
    }
    @RequestMapping("search2/{id}/{username}/{name}")
    public User search2(@PathVariable("id") Integer id,@PathVariable("username") String username,@PathVariable("name") String name){
    
    
        return userFeignClient.search2(id, username, name);
    }
}

5 Test
Verwenden Sie zuerst den Anbieter, um
http: // localhost: 8001 / search / 3 / zhangsan / zz
Fügen Sie hier eine Bildbeschreibung ein
zu besuchen, und verwenden Sie dann den Verbraucher, um
http: // localhost: 8011 / search / 3 / zhangsan / zz zu besuchen
Fügen Sie hier eine Bildbeschreibung ein

Ich denke du magst

Origin blog.csdn.net/qq_39095899/article/details/107463543
Empfohlen
Rangfolge