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.
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
zu besuchen, und verwenden Sie dann den Verbraucher, um
http: // localhost: 8011 / search / 3 / zhangsan / zz zu besuchen