阅读背景:

RIbbon实现SpringCloud微服务负载均衡

来源:互联网 

两个服务提供者,一个服务消费者

消费者多次请求,把请求分发到不同的提供者身上,达到负载均衡的目的。

提供者:

启动类:

@EnableDiscoveryClient
@SpringBootApplication
public class StartServer {
    public static void main(String args[]) {
        SpringApplication.run(StartServer.class,args);
    }
}

dao层:

@Repository
public interface UserRepository extends JpaRepository<User,Long> {
}

控制层:

@RestController
public class UserController {
    @Autowired
    private UserRepository userRepository;

    @GetMapping("/{id}")
    public User findById(@PathVariable Long id){
        User userInfo=userRepository.findOne(id); 
        System.out.println("user-copy"); //为了注名是哪个服务提供者提供的服务,所以我在这里打印了一句话,在另一个提供者打印了 “user”
        return userInfo;
    }
}

pojo:

public class User {
    //省略了setter/getter
    private Long id;
    private String username;
    private String name;
    private Integer age;
    private BigDecimal balance;
}

配置文件:

spring:
  application:
    name: microservice-provider-user
eureka:
  client:
    serviceUrl:
      defaultZone: https://localhost:8090/eureka/
    healthcheck: true
  instance:
    prefer-ip-address: true
  jpa:
    show-sql: false
    generate-ddl: false
    hibernate:
      ddl-auto: none
  datasource:
    platform: h2
    schema: classpath:schema.sql
    data: classpath:data.sql
logging:
  level:
    root:INFO
    org.hibernate:INFO
    org.hibernate.type.descriptor.sql.BasicBinder:TRACE
    org.hibernate.type.descriptor.sql.BasicExtractor:TRACE
server:
  port: 8003
二、服务消费者

启动类:

@EnableDiscoveryClient
@SpringBootApplication
public class StartMovieRibbon {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
    public static void main(String args[]) {
        SpringApplication.run(StartMovieRibbon.class,args);
    }
}

控制层代码:

@RestController
public class MovioRibbonController {
    @Value("${user.userServiceUrl}")
    private String userServiceUrl;
    @Autowired
    private RestTemplate restTemplate;
    @GetMapping("/user/{id}")
    public User findById(@PathVariable Long id){
        return this.restTemplate.getForObject(userServiceUrl+id,User.class);
    }
}

vo:

public class User {
    private Long id;
    private String username;
    private String name;
    private Integer age;
    private BigDecimal balance; //sh
}

配置文件:

server:
  port: 8081
info:
  app:
    name: @project.artifactId@
    encoding: @project.build.sourceEncoding@
    java:
      source: @java.version@
      target: @java.version@
user:
  userServiceUrl: https://microservice-provider-user/
spring:
  application:
    name: microservice-consumer-movie
eureka:
  client:
    serviceUrl:
      defaultZone: https://localhost:8090/eureka/
  instance:
    prefer-ip-address: true

两个服务提供者是相同的,复制一份改下端口就好。

以上的步骤完成后,分别启动两个提供者和一个消费者。上面的代码加入了Eureka服务发现的组件。我们可以使用它查看程序的状态:如下图


 
 

上面可以看到我们启动的服务了。接着就是测试了。

访问:https://localhost:8081/user/1

点击了5次:两个提供服务的微服务都打印了我们预先写在程序中的输出语句。如下图:

服务提供者1:


服务提供者2:


加起来正好访问了5次:说明达到了我们负载均衡的目的

参考资料:

《Spring Cloud与Docker微服务架构实战》 。周立著


分享到: