4.环境搭建
1.springboot项目:
创建provider作为服务提供方
创建consumer作为服务调用方
1.provider代码示例
结构如图
1.启动类代码
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class);
}
}
2.控制层代码
@RestController
public class PersonProviderController {
@Autowired
private PersonProviderService providerService;
@GetMapping(value = "/provider/getPerson")
public Person getPerson(){
return providerService.getPerson();
}
}
3.业务层代码
@Service
public class PersonProviderService {
public Person getPerson() {
return new Person("吴孟达", 18);
}
}
4.实体类代码:(实体注意要有get/set方法,有参/无参构造器)
public class Person {
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.6</version>
</dependency>
2.consumer代码
其他一致
启动类代码:
@SpringBootApplication
public class ConsumerApplication {
//重点1:注入RestTemplate的组件用于远程调用
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class);
}
}
控制层代码:
@RestController
public class PersonConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/consumer/getPerson")
public Person getPerson() {
//重点2:使用restTemplate进行远程调用
ResponseEntity<Person> person = restTemplate进行远程调用.getForEntity("http://localhost:8080/provider/getPerson", Person.class);
return person.getBody();
}
}
项目改进为Dubbo
1.增加Dubbo依赖
1.dubbo的stater
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.0.7</version>
</dependency>
2.dubbo的rpc协议
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-rpc-dubbo</artifactId>
<version>3.0.7</version>
</dependency>
3.dubbo的zk注册中心
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-zookeeper</artifactId>
<version>3.0.7</version>
</dependency>
2.配置properties
1.consumer的配置
server.port=8081
dubbo.application.name=consumer-application
#zk地址
dubbo.registry.address=zookeeper://192.168.2.128:2181
2.provider的配置
server.port=8080
dubbo.application.name=provider-application
#dubbo协议名称
dubbo.protocol.name=dubbo
#协议端口
dubbo.protocol.port=20880
dubbo.registry.address=zookeeper://192.168.2.128:2181
3.整体架构
1.common代码
接口:
public interface PersonServiceApi {
public Person getPerson();
}
实体类:必须实现序列化接口
public class Person implements Serializable {
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
provider代码:
1.启动类
@SpringBootApplication
//重点1:加上EnableDubbo注解,开启dubbo功能
@EnableDubbo
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class);
}
}
2.业务实现层
//重点2:加@DubboService将组件注入到容器,并且可以加入版本
@DubboService(version = "person_verson1")
public class PersonProviderServiceImpl implements PersonServiceApi {
public Person getPerson() {
return new Person("吴孟达", 18);
}
}
//重点3:2版本
@DubboService(version = "person_verson2")
public class PersonProviderServiceImpl1 implements PersonServiceApi {
public Person getPerson() {
return new Person("刘丹", 18);
}
}
consumer代码:
1.启动类代码:
@SpringBootApplication
//重点1:开启dubbo功能
@EnableDubbo
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class);
}
}
2.控制层代码:
@RestController
public class PersonConsumerController {
//重点2:使用DubboReference租入对应的接口类,并且可以铜鼓version字段选择业务层版本
@DubboReference(version = "person_verson1")
PersonServiceApi personService;
@GetMapping("/consumer/getPerson")
public Person getPerson() {
Person wmd = personService.getPerson();
return wmd;
}
}
这时调用消费者的接口:
改造消费者接口:两个版本的业务层都调用下
@RestController
public class PersonConsumerController {
@DubboReference(version = "person_verson1")
PersonServiceApi personService;
@DubboReference(version = "person_verson2")
PersonServiceApi personService2;
@GetMapping("/consumer/getPerson")
public List<Person> getPerson() {
Person wmd = personService.getPerson();
Person ld = personService2.getPerson();
return Arrays.asList(wmd,ld);
}
}