typora-copy-images-to: imgs
Call between microservices
1. Call of microservice - Ribbon + resttemplate (independent component)
1. What makes Ribbon
Ribbon is a client-side load balancer, which is used to call the load balancing of microservices between spring cloud
2. Load balancing between server and client
[failed to transfer the pictures in the external link. The source station may have anti-theft chain mechanism. It is recommended to save the pictures and upload them directly (img-vZlGLVD5-1593147103566)(imgs/1592359063328.png))
Load balancing method
1. Client load balancing
2. Load balancing on the server
Network layer 4 load
Network layer 7 load -- nginx
2. Use of bbbbon + resttemplate
1. Create an eureka service center, create a student service and class service, and let the student service call the class service
[failed to transfer the pictures in the external link. The source station may have anti-theft chain mechanism. It is recommended to save the pictures and upload them directly (img-lKB8omo9-1593147103568)(imgs/1592359230273.png))
2. Add a dependency on the active caller (student service calls class service, and student service is the active caller)
<!--Microservice called ribbon Dependence on--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>
3. Declare the Restemplate component in the caller's startup class
@Bean @LoadBalanced //load balancing public RestTemplate restTemplate(){ return new RestTemplate(); }
4. Write call code at the caller
@RestController public class StudentController { @Autowired private RestTemplate restTemplate; @GetMapping("findStuById") public String findStudent( @RequestParam("sid")Integer sid){ String className = restTemplate. // According to the id, query which class the students belong to // Spring class is the name of class micro service getForObject("http://spring-class/findClaById?cid="+sid,String.class); switch (sid){ case 1: return "Xiao Zhang"+"class:"+className; case 2: return "Xiao Feng"+"class:"+className; case 3: return "Small directors"+"class:"+className; default: return "No one"; } } }
5. Load balancing of ribbon
How does eureka know whether two services are clustered or independent The same name of microservice is cluster relationship The microservice name is the name of the global configuration file spring.application.name Value of
6. Configuration of ribbon's load balancing strategy
IRule interface represents load balancing strategy
@Bean public IRule iRule(){ // RandomRule is a sub implementation class of IRule, which is a load balancing strategy return new RandomRule(); }
3. Service call - feign (in fact, the bottom layer is the Ribbon)
1. Why do we need Feign when we have Ribbon?
The bottom layer of feign also calls the Ribbon. Feign is essentially a collection of the bbon + hystrix (porcupine). Because the writing method of Ribbon itself is not object-oriented, many java programmers are not accustomed to this writing method
2. Use of feign
2.1 add a dependency on the caller (create a teacher's microservice and let the class microservice call the teacher's microservice)
<!--add to feign rely on--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
2.2 define a feign interface
//The name of the microservice is used in the annotation @FeignClient("spring-teacher") public interface ITeacherFeign { // Declare the method and request path, and the method name can be started at will, but for the convenience of later management, use the method name to be called @RequestMapping(value = "findTeaById",method = RequestMethod.GET) String getTeacherName( @RequestParam("tid")Integer tid); }
2.3. Inject where the microservice needs to be called and write code
@RestController public class ClassControler { @Resource private ITeacherFeign iTeacherFeign; @GetMapping("findClaById") public String findClass( @RequestParam("cid")Integer cid){ String s = iTeacherFeign.getTeacherName(cid); switch (cid){ case 1: return "java1910"+s; case 2: return "java1911"+s; case 3: return "java1912"+s; default: return "There is no such class"; } } }
4. Feign timeout and retry
The default timeout of Feign is 1s. If the callee does not return a result within 1s, it will fail by default, and then try again. Sometimes, without intervention, it may cause repeated sending of the request, leading to various problems
Note: Feign's own timeout and retry functions are turned off by default, so the timeout and retry effects we see are provided by the underlying Ribbon. If Feign's timeout retry is turned on, the settings of the Ribbon will be overwritten
4.1 configure timeout and retry of Ribbon
spring.application.name=spring-class server.port=8083 eureka.client.service-url.defaultZone: http://localhost:20000/eureka #Configure connection timeout ribbon.ConnectTimeout=1000 #Configure read timeout ribbon.ReadTimeout=2000 #Maximum retries of the same instance, excluding the first call ribbon.MaxAutoRetries=2 ##Retry the maximum number of retries for other instances of load balancing, excluding the first call ribbon.MaxAutoRetriesNextServer=2 # So the number of retries is equal to (MaxAutoRetries+1)*(MaxAutoRetriesNextServer+1) # Configure feign timeout. Once feign timeout is configured, the timeout and retry of ribbon will fail. It can configure different timeout for different microservices #Configure the connection timeout of spring teacher microservice feign.client.config.spring-teacher.connectTimeout=1000 #Configure read timeout feign.client.config.spring-teacher.readTimeout=2000