两个服务提供者,一个服务消费者
消费者多次请求,把请求分发到不同的提供者身上,达到负载均衡的目的。
提供者:
启动类:
@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: http://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: http://microservice-provider-user/
spring:
application:
name: microservice-consumer-movie
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8090/eureka/
instance:
prefer-ip-address: true
两个服务提供者是相同的,复制一份改下端口就好。
以上的步骤完成后,分别启动两个提供者和一个消费者。上面的代码加入了Eureka服务发现的组件。我们可以使用它查看程序的状态:如下图
上面可以看到我们启动的服务了。接着就是测试了。
访问:http://localhost:8081/user/1
点击了5次:两个提供服务的微服务都打印了我们预先写在程序中的输出语句。如下图:
服务提供者1:
服务提供者2:
加起来正好访问了5次:说明达到了我们负载均衡的目的
参考资料:
《Spring Cloud与Docker微服务架构实战》 。周立著