所有代码发布在 [https://github.com/hades0525/leyou]
springCloud
父项目管理pom
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
<relativePath/><!--lookupparentfromrepository-->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
<mapper.starter.version>2.0.3</mapper.starter.version>
<mysql.version>5.1.32</mysql.version>
</properties>
<dependencyManagement>
<dependencies>
<!--springCloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--通用mapper-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>${mapper.starter.version}</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
子项目user的pom(生产者)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
</dependency>
</dependencies>
user要调用数据库里的数据所以要用通用mapper
子项目consumer的pom(消费者)
dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
consumer不用调用数据库里的东西
直接远程调用user的方法
通过 restTemplate
@RestController
@RequestMapping("consumer")
publicclassconsumerController{
@Autowired
private RestTemplate restTemplate;
@GetMapping("{id}")
public UserqueryById(@PathVariable("id")Longid){
Stringurl="http://localhost:8081/user/"+id;
Useruser=restTemplate.getForObject(url,User.class);
returnuser;
}
}
@SpringBootApplication
publicclassConsumerApplication{
@Bean
publicRestTemplaterestTemplate(){
returnnew RestTemplate();
}
publicstaticvoidmain(String[]args){
SpringApplication.run(ConsumerApplication.class,args);
}
}
这种方法ip地址写定了,属于静态获取服务
eureka (为了能够动态获取服务)
注册器,所有的服务都注册到eureka上,由eureka管理
eureka也有可能宕机,所以eureka自己也要是一个集群,自己也要注册到自己的服务器
新建一个eureka module
pom:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
启动类:
@EnableEurekaServer
@SpringBootApplication
publicclassEurekaServer{
publicstaticvoidmain(String[]args){
SpringApplication.run(EurekaServer.class);
}
}
application.yml
server:
port:10086
spring:
application:
name:eureka-server
eureka:
client:
service-url:
defaultZone:http://127.0.0.1:10086/eureka
服务端写好了之后就要写客户端了
1.在user-service子项目中引入依赖(生产者)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.启动类上加@EnableDiscoveryClient
3.application.yml中
eureka:
client:
service-url:
defaultZone:http://127.0.0.1:10086/eureka
再给user-service取个名字
spring:application:name:user-service
如果出现ip地址混乱的情况,可以再生产者一方加上
eureka:
instance:
prefer-ip-address:true
ip-address:127.0.0.1
在consumer-service和user-service一样
1.引入依赖
2.启动类上加上注解
3.application.yml配置
eureka配置好了以后,就可以在consumer动态的调用user了
@RestController
@RequestMapping("consumer")
publicclassconsumerController{
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("{id}")
public UserqueryById(@PathVariable("id")Longid){
//根据服务id获取实例
List<ServiceInstance> instances=discoveryClient.getInstances("user-service");
//从实例中取出ip和端口
ServiceInstance instance=instances.get(0);
Stringurl="http://"+instance.getHost()+":"+instance.getPort()+"/user/"+id;
User user=restTemplate.getForObject(url,User.class);
returnuser;
}
}
eureka集群
启动几台eureka互相注册,形成一个集群
1.复制eureka的configuration
2.修改端口和defaultZone的ip为互相的端口和ip
实现相互注册
设置eureka.client.register-with-erueka=false
eureka就不会再自己注册自己了
负载均衡
算法:随机,轮询,hash…
负载均衡器 ribbon
默认的方式为轮询
配置user2,不在配置文件里修改端口,通过jvm修改
实现负载均衡(消费者)
1.在consumer引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
2.启动类里
@LoadBalanced
@Bean
publicRestTemplaterestTemplate(){
returnnewRestTemplate();
}
3.直接通过服务的id访问
String url="http://user-service/user/"+id;
Useruser=restTemplate.getForObject(url,User.class);
可以添加配置,修改ribbon的负载均衡算法
user-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
错误:
1.在启动类里面
@MapperScan("cn.itcast.user.mapper")应该导入mybaits的包
import tk.mybatis.spring.annotation.MapperScan;
2.版本问题
springboot2.0.x 和springcloud Finchley SR1/2
springboot2.1.x和springcloud GreenWich M1/2